在调用具有以下签名的库函数时:
func New() (*sql.DB, Sqlmock, error)
像这样:
suite.db, suite.mock, err := sqlmock.New() // inside a suite method
我遇到错误
expected identifier on left side of :=
但是,当我更改为此
var err error
suite.db, suite.mock, err = sqlmock.New()
错误消失了! 为什么在:=
分配中声明k
答案 0 :(得分:4)
:=
声明一个新变量“ identifier”。这意味着您正在程序中添加一个可以分配值的命名事物。结构的字段已经被命名,因为在golang解析器中知道它们存在,因此在这种情况下使用:=
对golang没有意义。
为什么在:=分配中声明k
我不确定“ k
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)
上面的方法也很好。
答案 1 :(得分:3)
:=
不是assignment,而是short variable declaration。分配使用例如简单的=
运算符。
顾名思义,它是声明变量。 suite.db
不是变量,它是expression,更具体地说是primary expression; selector准确地说。
短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
IdentifierList
在哪里:
IdentifierList = identifier { "," identifier } .
因此,您必须列出identifiers。 重新声明:
是此“声明新变量规则”的“例外”:与常规变量声明不同,简短的变量声明可以重新声明,前提是它们最初是在相同类型的同一块中(如果该块是函数体,则在参数列表中)更早地声明,并且非blank变量中的至少一个是新变量。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;只是为原始值分配了一个新值。
因此,如果在同一个块中声明了现有变量,则可以在短变量声明中使用它们,并且还提供新的标识符(不仅是现有的标识符,在这种情况下,您必须使用赋值)。 / p>
查看相关内容:Why there are two ways of declaring variables in Go, what's the difference and which to use?
当您事先声明err
并将:=
更改为=
时,它会起作用,因为赋值不需要赋值运算符左侧的标识符,而是表达式:
Assignment = ExpressionList assign_op ExpressionList .
如上所述,suite.db
是一个表达式,就像现有变量(标识符)一样。