遍历数组是编写简单循环的不好方法吗?
我有时厌倦了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循环。
总而言之,不要:-)