2 回答
TA贡献1796条经验 获得超4个赞
:=
不是赋值,它是一个简短的变量声明。赋值使用例如简单=
运算符。
顾名思义:就是声明变量。suite.db
不是一个变量,它是一个表达式,更具体地说是一个主表达式;准确地说是一个选择器。
短变量声明使用语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
在哪里IdentifierList
:
IdentifierList = identifier { "," identifier } .
所以你必须列出标识符。此“声明新变量规则”的一个“例外”是重新声明:
与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(如果块是函数体,则为参数列表)中较早声明的,具有相同的类型,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;它只是为原始值分配了一个新值。
因此,如果它们是在同一块中声明的,则允许在简短的变量声明中使用现有变量,并且您还提供新的标识符(不仅仅是现有的标识符——在这种情况下,您将不得不使用赋值)。
err
当您先声明并:=
对其=
进行更改时,因为赋值不需要赋值运算符左侧的标识符,而是表达式:
Assignment = ExpressionList assign_op ExpressionList .
并且如上所述,suite.db
是一个表达式,就像现有变量(标识符)一样。
TA贡献1818条经验 获得超8个赞
:=声明一个新变量“标识符”。这意味着您在程序中添加了一个可以赋值的命名事物。结构的字段已经命名,因为在 golang 解析器中知道它们存在,所以:=在这种情况下使用对 golang 没有意义。
为什么在 a := 赋值中声明 k < n 变量会失败?!
我不确定“k < n”是什么意思,但我认为你的意思是“为什么在:=失败的左侧有多个变量?”。如果那是你的意思,那不是真的。
x, y, z := func() (int,int,int) {return 1,2,3}()
fmt.Println(x, y, z)
工作得很好。问题是 golang 无法为结构字段创建“标识符”(又名新命名的变量),因为该结构字段已经存在。
编辑:我刚刚灵机一动,你的意思可能是“为什么只有一些新的标识符在左侧声明:=不起作用?”。这也不是真的。
x, y := 5, 6
fmt.Println(x, y)
x, y, z := 1, 2, 3
fmt.Println(x, y, z)
以上工作也很好。
- 2 回答
- 0 关注
- 108 浏览
添加回答
举报