为什么在golang中仅初始化定义中的一个变量会失败

时间:2018-08-29 19:20:49

标签: go

在调用具有以下签名的库函数时:

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

2 个答案:

答案 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 expressionselector准确地说。

短变量声明使用以下语法:

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是一个表达式,就像现有变量(标识符)一样。