通常人们认为iota就是0,其实并非如此。
确切的说,当iota在紧跟着关键字const的第一行出现时,iota为0,在第二行出现时,iota为1,以此类推;当iota再次遇到const时,重置为0.
golang spec关于iota的说明:http://golang.org/ref/spec#Iota
下面来看几段代码吧。
1、例1
package main import "fmt" const i1 = iota const j1 = iota const k1 = iota func main() { fmt.Println("i1, j1, k1", i1, j1, k1) fmt.Println("Hello, playground") }
http://play.golang.org/p/LQEyApa6dq
输出:
i1, j1, k1 0 0 0
2、例2
package main import "fmt" const ( i1 = iota j1 = iota k1 = iota ) func main() { fmt.Println("i1, j1, k1", i1, j1, k1) fmt.Println("Hello, playground") }
输出:
i1, j1, k1 0 1 2
http://play.golang.org/p/gVhf2oC3Y4
这是我们最常使用的例子。
3、例3
package main import "fmt" const ( i1, j1,k1 = iota, iota, iota ) func main() { fmt.Println("i1, j1, k1", i1, j1, k1) fmt.Println("Hello, playground") }
http://play.golang.org/p/W1-umpoOwS
输出:
i1, j1, k1 0 0 0
这个例子中,由于iota在同一行,因此,只计算一次,就是0
4、例4
package main import "fmt" const ( i1 = -1 j1 = iota k1 ) func main() { fmt.Println("i1, j1, k1", i1, j1, k1) fmt.Println("Hello, playground") }
http://play.golang.org/p/C8ff8k1JAS
输出:
i1, j1, k1 -1 1 2
在这个例子中,由于iota在const的第二行出现,因此是1,这是最常犯的错误!!!
有疑问加站长微信联系(非本文作者)