首页 > 解决方案 > 遍历数组是编写简单循环的坏方法吗?

问题描述

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 次击键?我觉得脏。

标签: loopsgo

解决方案


虽然安全,但我认为这不是惯用的。在 Go 中,尽可能使用最简单的代码。原始for循环对读者来说更清晰,代码应该针对阅读进行优化,而不是为了节省击键(为了节省击键,考虑配置你的编辑器/IDE?)

如果你坚持让它更短,至少使用https://pkg.go.dev/github.com/bradfitz/iter之类的东西(或重新实现它 - 这很简单),以便能够编写:

for i := range iter.N(10) {
    // ....
}

这比在其中显式地拥有该数组更短且更具可读性,尽管我仍然认为它的可读性不如香草for循环。


总而言之,只是不要:-)


推荐阅读