Types 范围中的类型重新声明顺序是否应受到外部范围的影响?

Types 范围中的类型重新声明顺序是否应受到外部范围的影响?,types,go,scope,Types,Go,Scope,我收到一条奇怪的错误消息无法使用[]提要文字(type[]提要)作为type[]提要的字段值,经过一些修改和最小化源代码后,我发现这种情况似乎产生了错误: type user struct { Feeds []feed } type feed struct{} func fn() { type user struct { Feeds []feed // seems to refer to the outer feed type } type fe

我收到一条奇怪的错误消息
无法使用[]提要文字(type[]提要)作为type[]提要的字段值
,经过一些修改和最小化源代码后,我发现这种情况似乎产生了错误:

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{},
    }
}

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

简单地说,这是因为声明的顺序在函数内部很重要,但在函数外部并不重要。在包范围内,符号以满足其依赖性的顺序声明,独立于它们在页面上的外观;在函数中,它们是按词法顺序声明的。片刻的反思将说明为什么这种不一致有其优点,尽管它是不一致的。
-抢劫


语言规范就是这样

引用相关部分:

在函数中声明的类型标识符的作用域从TypeSpec中的标识符开始,并在最内部包含块的末尾结束

函数内声明的类型仅在类型标识符(正在声明)的作用域中。在此之前,他们不是

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

谢谢我猜这或多或少是罗布回答的,但用了一种更正式的方式:)投了赞成票。不确定这个问题有什么问题。似乎甚至该语言的一位作者也认为这有点不一致,但这是有充分理由的。