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
在golang中,为什么只初始化定义中的一个变量会失败_Go - Fatal编程技术网

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

在golang中,为什么只初始化定义中的一个变量会失败,go,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() 错误消失了为什么

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

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

:=
声明一个新变量“identifier”。这意味着您要在程序中添加一个可指定值的命名对象。结构的字段已经命名,因为golang解析器知道它们存在,所以在这种情况下使用
:=
对golang没有意义

为什么在a:=赋值中声明k 我不知道“k:=的左侧有多个变量会失败?”。如果你是这个意思,那就不对了

x, y, z := func() (int,int,int) {return 1,2,3}()
fmt.Println(x, y, z)
x, y := 5, 6
fmt.Println(x, y)
x, y, z := 1, 2, 3
fmt.Println(x, y, z)
很好用。问题是golang无法为结构字段创建“标识符”(即新命名的变量),因为该结构字段已经存在

编辑: 我刚刚有一个想法,你可能是说“为什么只有一些新的标识符在
:=
的左侧声明不起作用?”。这也不是事实

x, y, z := func() (int,int,int) {return 1,2,3}()
fmt.Println(x, y, z)
x, y := 5, 6
fmt.Println(x, y)
x, y, z := 1, 2, 3
fmt.Println(x, y, z)
上面的方法也很好。

:=
不是,它是一个。赋值使用例如简单的
=
运算符

正如它的名字所说:它是用来声明变量的
suite.db
不是一个变量,它是一个,更具体地说是一个;准确地说,是一个很好的例子

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

在哪里:

所以你必须列出。“声明新变量规则”的一个“例外”是重新声明:

与常规变量声明不同,短变量声明可以重新声明相同类型的同一块(如果块是函数体,则为参数列表)中最初声明的变量,并且至少有一个非变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是将一个新值赋给原始值

因此,如果在同一块中声明了现有变量,则允许在简短的变量声明中使用这些变量,并且还可以提供新的标识符(不仅仅是现有的标识符,在这种情况下,必须使用赋值)

见相关文件:

当您声明
err
previor并将
:=
更改为
=
时,它会起作用,因为赋值运算符左侧不需要标识符,而需要表达式:


如上所述,
suite.db
是一个表达式,就像现有变量(标识符)一样。

:=
是同时声明和初始化变量的快捷运算符。不能“声明”结构的字段。
Assignment = ExpressionList assign_op ExpressionList .