Go 无法推断赋值中的类型:“:= 左侧的非名称”

此代码段按预期工作play.golang.org/p/VuCl-OKMav


i := 10

next := 11

prev, i := i, next

然而,这个几乎相同的片段给出了non-name f.Bar on left side of := play.golang.org/p/J8NNWPugQG


type Foo struct {

    Bar int

}


f := Foo{10}

next := 11

prev, f.Bar := f.Bar, next

停止类型推断的结构有什么特别之处?这是一个错误吗?


翻阅古今
浏览 310回答 3
3回答

慕标琳琳

这是一个开放的问题。问题 6842:规范:使用短声明符号分配给字段

波斯汪

这不是真正的类型推断问题,只是左侧:=必须是标识符列表,而f.Bar不是标识符,因此不能声明——即使:=是稍微宽松的规则也不行它可以声明什么。请参阅Go 编程语言规范中的“短变量声明”。

森栏

从规范的短变量声明部分:与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块中较早地声明......具有相同的类型,并且至少有一个非空变量是新的。因此,如果您在另一种类型(示例中的 struct Foo)中声明变量,则“假设它们最初是在同一块中较早地声明的”将取消其资格。所以答案是只将预先声明的变量设置为等于不使用 := 语法的值:...var prev intprev, f.Bar = f.Bar, next...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go