loops - 遍历数组是编写简单循环的坏方法吗?
问题描述
for i := 0; i < 7; i++ {
我有时厌倦了为不需要循环迭代器的恒定数量的循环编写 ForClause循环。我有时希望我可以使用范围和整数,for range 7 {
但这是无效的。我发现你可以使用for range [7]int{} {
.
看起来不错:
package kata
import (
"runtime"
"testing"
)
const times = 100_000
func BenchmarkLoop(b *testing.B) {
b.Run("For", func(b *testing.B) {
for j := 0; j < b.N; j++ {
for i := 0; i < times; i++ {
runtime.Gosched()
}
}
})
b.Run("Range", func(b *testing.B) {
for j := 0; j < b.N; j++ {
for range [times]int{} {
runtime.Gosched()
}
}
})
}
% go test -bench=. -benchmem
goos: darwin
goarch: amd64
pkg: github.com/brackendawson/kata
cpu: Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
BenchmarkLoop/For-12 157 8963540 ns/op 0 B/op 0 allocs/op
BenchmarkLoop/Range-12 162 7651102 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/brackendawson/kata 4.695s
这安全吗?我是否毫无意义地节省了 4 次击键?我觉得脏。
解决方案
虽然安全,但我认为这不是惯用的。在 Go 中,尽可能使用最简单的代码。原始for
循环对读者来说更清晰,代码应该针对阅读进行优化,而不是为了节省击键(为了节省击键,考虑配置你的编辑器/IDE?)
如果你坚持让它更短,至少使用https://pkg.go.dev/github.com/bradfitz/iter之类的东西(或重新实现它 - 这很简单),以便能够编写:
for i := range iter.N(10) {
// ....
}
这比在其中显式地拥有该数组更短且更具可读性,尽管我仍然认为它的可读性不如香草for
循环。
总而言之,只是不要:-)
推荐阅读
- python - Snakemake 删除 --config 值中的下划线?
- php - 使用 mailtrap 在 laravel 中发送电子邮件
- google-cloud-platform - public instance CNAME for GCP compute instance
- node.js - 使用 Promise 在 MongoDB 中插入记录的 Node.js 程序示例
- javascript - How to have aspect ratio by parent height?
- django - 如何模拟原生 CREATE 响应
- windows - How to access a different console, such as writing to its input buffer
- java - 如何将 JSON 字段的各种可能类型映射到 POJO 属性?
- c++ - C - 外部结构
- netlogo - How to plot distributions of two different breeds