iota是Golang中的一个特殊变量,通常在定义“枚举”时使用。
1. 单独声明每个常量,每遇到const时iota为0
package main
import "fmt"
const a = iota
const b = iota
func main() {
fmt.Printf("a = %d\r\nb = %d", a, b)
}
输出:
a = 0
b = 0
2. iota在const组合中的使用,也就是常用的“枚举”声明中使用,要小心谨慎
1)连续使用
package main
import "fmt"
const a = iota
const (
b = iota
c = iota
)
func main() {
fmt.Printf("a = %d\r\nb = %d\nc = %d", a, b, c)
}
输出:
a = 0
b = 0
c = 1
可以理解为两个const就近服务了a和b的iota,所以a、b为0
2)插入其他值
package main
import "fmt"
const (
a = iota
b = 100
c = iota
)
func main() {
fmt.Printf("a = %d\r\nb = %d\nc = %d", a, b, c)
}
输出:
a = 0
b = 100
c = 2
c的值没有因为前面的b = 100而打乱原有的节奏,如果c没有iota会是什么样子???
package main
import "fmt"
const (
a = iota
b = 100
c
)
func main() {
fmt.Printf("a = %d\r\nb = %d\nc = %d", a, b, c)
}
输出:
a = 0
b = 100
c = 100
由于b的出现,影响了iota的作用,c的值和b相等。
3)前面已存在确定值
package main
import "fmt"
const (
a = 100
b = iota
c = iota
)
func main() {
fmt.Printf("a = %d\r\nb = %d\nc = %d", a, b, c)
}
输出:
a = 100
b = 1
c = 2
可以看出这里b没有从0开始,依旧是之前的节奏,每行都安排好了一个值,不论用还是不用。这里如果c去掉iota,输出结果一样,没有不同。
在定义枚举时一定要注意这些细节,不然很容易造成取值错误。