循环切片别名(用户定义)类型会在别名之前给出类型

时间:2018-06-15 14:43:54

标签: go

我正在尝试遍历用户定义类型的片段(在下面的例子中是别名的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 /其他问题中找到任何信息。如果有人对此有任何意见,请分享!

1 个答案:

答案 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

irange索引,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")
        }
    }
}