亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 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條經驗 獲得超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)

以上工作也很好。


查看完整回答
反對 回復 2023-03-29
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號