我正在尝试遍历用户定义类型的片段(在下面的例子中是别名的int),但是range产生int类型的值,而不是我期望的MyInt。在'if'内部进行转换有助于确定,但我想了解为什么range不会产生MyInt类型的值。
package main
import (
"fmt"
)
type MyInt int
const (
MYINT00 MyInt = iota
MYINT01
)
func main() {
var myInt02 MyInt = 2
myInts := []MyInt{MYINT00, MYINT01}
for i := range myInts {
if i == myInt02 {
fmt.Println("same")
}
}
}
游乐场:https://play.golang.org/p/nb77pvTMdkW
错误:
prog.go:18:8: invalid operation: i == myInt02 (mismatched types int and MyInt)
然后我认为这个问题可能与consts和iota有关,所以我使用了函数声明的变量 - 没有改变任何东西。
https://play.golang.org/p/0fVRhBtvlOL https://play.golang.org/p/pioDSU4oJdP
我没有在Effective Go /其他问题中找到任何信息。如果有人对此有任何意见,请分享!
答案 0 :(得分:3)
The Go Programming Language Specification
For statements with range clause
Range expression 1st value 2nd value array or slice a [n]E, *[n]E, or []E index i int a[i] E
i
是range
索引,int
,而非range
值。
例如,修复代码以使用range
值
package main
import (
"fmt"
)
type MyInt int
const (
MYINT00 MyInt = iota
MYINT01
)
func main() {
var myInt02 MyInt = 2
myInts := []MyInt{MYINT00, MYINT01}
for _, v := range myInts {
if v == myInt02 {
fmt.Println("same")
}
}
}