我收到一条奇怪的错误消息cannot use []feed literal (type []feed) as type []feed in field value,经过一番摆弄并最小化了源代码之后,我发现这种情况似乎会产生错误:

type user struct {
    Feeds []feed
}
type feed struct{}

func fn() {
    type user struct {
        Feeds []feed // seems to refer to the outer feed type
    }
    type feed struct{}

    _ = user{
        // "cannot use []feed literal (type []feed) as type []feed in field value"
        Feeds: []feed{},
    }
}

http://play.golang.org/p/gNIGhPwAgl

这是预期的行为还是错误?我花了一些时间阅读语言规范,但找不到任何明确说明作用域中的类型声明顺序应如何工作的内容。顺序在外部作用域中无关紧要,而在内部作用域中则无关紧要,这有点不直观。

最佳答案

语言规范就是这样。

引用相关部分:Declarations and scope:



在函数内部声明的类型仅在类型标识符(已声明)的范围内。在此之前,它们不是。

type user struct {
    Feeds []feed // This can only be the outer feed type
}

type feed struct{} // new feed type is in scope from this line

09-28 06:28