Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go无法推断分配中的类型:";左侧的非名称:=";_Go_Type Inference - Fatal编程技术网

Go无法推断分配中的类型:";左侧的非名称:=";

Go无法推断分配中的类型:";左侧的非名称:=";,go,type-inference,Go,Type Inference,此代码段按预期工作 i:=10 下一个:=11 prev,i:=i,next 然而,这个几乎相同的代码片段在:= 类型Foo struct{ Bar int } f:=Foo{10} 下一个:=11 上一个,前一个:=前一个,下一个 停止类型推断的结构有什么特殊之处?这是一个错误吗?这不是一个真正的类型推断问题,只是:=的左侧必须是一个标识符列表,而f.Bar不是标识符,所以不能声明它-即使是:=的稍微宽松的规则也不能声明。请参阅。这是一个悬而未决的问题 :spec:从spec的部分分配给具

此代码段按预期工作

i:=10
下一个:=11
prev,i:=i,next
然而,这个几乎相同的代码片段在:=

类型Foo struct{
Bar int
}
f:=Foo{10}
下一个:=11
上一个,前一个:=前一个,下一个

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

这不是一个真正的类型推断问题,只是
:=
的左侧必须是一个标识符列表,而
f.Bar
不是标识符,所以不能声明它-即使是
:=
的稍微宽松的规则也不能声明。请参阅。

这是一个悬而未决的问题

:spec:从spec的部分分配给具有简短声明符号的字段:

与常规变量声明不同,短变量声明可能 重新声明变量,前提是这些变量最初是在 相同的块…具有相同的类型,并且至少有一个非空 变量是新的

因此,如果在另一个类型(示例中为struct Foo)中声明变量,则“如果它们最初在同一块中声明过”,则会取消该变量的资格

因此,答案是只将预先声明的变量设置为相等,而不使用:=语法将值设置为:

...
var prev int
prev, f.Bar = f.Bar, next
...

一个相关的问题:有没有理由不扩展短变量声明的规范来允许任何可分配的名称呢?@deft_code:我不知道。我怀疑这会使解析器有些复杂,因为如果任意复杂的表达式(带有函数调用和指针解引用等)可以出现在左侧(在解析器看到
:=
之前很久),那么解析器必须临时允许在更复杂的上下文中使用未声明的标识符(直到它看到
:=
或者可以排除它正在解析一个短变量声明)。但我不知道这是否是原因。也许语言设计者只是觉得
prev,I:=I,next
是他们愿意制造的一个大例外。