为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕工程0101907 2021-11-08 16:02:29
我收到一条奇怪的错误消息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这是预期的行为还是错误?我花了一些时间阅读语言规范,但找不到任何明确说明范围中的类型声明顺序应该如何工作的内容。顺序在外部作用域中无关紧要,但在内部作用域中却很重要,这有点不直观。
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

这是语言规范。


引用相关部分:声明和范围:


在函数内声明的类型标识符的范围从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


查看完整回答
反对 回复 2021-11-08
?
冉冉说

TA贡献1877条经验 获得超1个赞

在 golang-nuts 列表上找到了讨论这个的线程

简而言之,这是因为声明的顺序在函数内部很重要,但在外部无关紧要。在包范围内,符号按照满足其依赖关系的顺序声明,与它们在页面上的外观无关;在函数内部,它们按词法顺序声明。片刻的反思将表明为什么这种不一致是有价值的,尽管它是不一致的。
-抢


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信