为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MM们 2023-03-29 15:13:22
在调用具有以下签名的库函数时: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 < n 变量会失败?!
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

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

顾名思义:就是声明变量。suite.db不是一个变量,它是一个表达式,更具体地说是一个主表达式;准确地说是一个选择器。

短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

在哪里IdentifierList

IdentifierList = identifier { "," identifier } .

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

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

因此,如果它们是在同一块中声明的,则允许在简短的变量声明中使用现有变量,并且您还提供新的标识符(不仅仅是现有的标识符——在这种情况下,您将不得不使用赋值)。

err当您先声明并:=对其=进行更改时,因为赋值不需要赋值运算符左侧的标识符,而是表达式:

Assignment = ExpressionList assign_op ExpressionList .

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


查看完整回答
反对 回复 2023-03-29
?
弑天下

TA贡献1818条经验 获得超7个赞

:=声明一个新变量“标识符”。这意味着您在程序中添加了一个可以赋值的命名事物。结构的字段已经命名,因为在 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)

以上工作也很好。


查看完整回答
反对 回复 2023-03-29
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信