作為 Go“新手”,我不確定為什么在編譯程序時在控制臺中收到錯誤undefined err和undefined user。我有:if req.Id == nil { user, err := signup(C, c, &req)} else { user, err := update(C, c, &req)}if err != nil { c.JSON(http.StatusOK, err) return}doSomethingWith(user)我意識到我可以在條件塊之前聲明erranduser變量,但我想知道為什么這不起作用。這與一次性創建兩個新變量有關嗎?UDPATE 對此有點混亂。我現在有:user := core.User{}if req.Id == nil { user, err := signup(C, c, &req)} else { user, err := update(C, c, &req)}cleanUser(&user)我的錯誤現在是用戶聲明的,而不是使用的。我目前沒有解決錯誤部分,但我不確定為什么我會收到關于用戶的錯誤。
1 回答

忽然笑
TA貢獻1806條經驗 獲得超5個贊
這是因為err您正在創建的變量的范圍:它僅在范圍內(因此有效/可引用)直到您聲明它的最內層塊的末尾。
規范:聲明和范圍
在函數內聲明的常量或變量標識符的范圍從 ConstSpec 或 VarSpec(短變量聲明的 ShortVarDecl)的末尾開始,并在最里面的包含塊的末尾結束。
當您在if語句之前聲明它時,它將在容器塊結束之前一直處于范圍內,其中還包括if您測試err變量的第二個位置,所以沒關系。
UDPATE:
更新您的更新:您使用了一個Short 變量聲明來創建新變量,因為您在新塊中使用了它。您尚未使用這些新變量(僅在user內部塊外聲明的“其他”變量)因此出現編譯時錯誤“用戶聲明但未使用”。
解決方案很簡單:只需在 之前聲明兩個變量if,不要使用短變量聲明,而是簡單地賦值:
user := core.User{}
var err error
if req.Id == nil {
user, err = signup(C, c, &req)
} else {
user, err = update(C, c, &req)
}
if err == nil {
cleanUser(&user)
}
或者使用一行來聲明user和err:
user, err := core.User{}, error(nil)
- 1 回答
- 0 關注
- 252 瀏覽
添加回答
舉報
0/150
提交
取消