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

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

Go 類型推斷和命名返回變量

Go 類型推斷和命名返回變量

Go
胡說叔叔 2021-09-13 15:26:40
在 Go 中,如果你給返回變量命名,當函數開始時,它們會被初始化為零值。我在下面將這個功能與err行上的變量一起使用usr, err = user.Current()。是否可以對usr變量而不是變量使用類型推斷err?我真的不想聲明var usr *user.user我更愿意在這里使用類型推斷。func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {    if userSuppliedFilepath == "" {        usr, err = user.Current()        filepath = path.Join(usr.HomeDir, ".myprogram.config.json")    }    return}
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

不,你不能做你想做的事。


你的選擇是不使用命名返回,或者像你說的那樣聲明


var usr *user.User 

usr, err = user.Current()

在某些情況下,您可以這樣做,但在您的情況下,您正在創建一個 new ,err因為您在 if 塊中,并且它正在對 new 進行本地范圍的引用err。


查看完整回答
反對 回復 2021-09-13
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

如果您稍微重構代碼并且不將user.Current()調用放在另一個塊中(if在您的情況下),則可以使用:= Short 變量聲明:


func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {

    if userSuppliedFilepath != "" {

        return userSuppliedFilepath, nil

    }


    usr, err := user.Current()

    filepath = path.Join(usr.HomeDir, ".myprogram.config.json")

    return

}

編輯:


你可能會說這個代碼比起原來的更長,但請注意,您原來的代碼是沒有有效的,也是不完整的,因為當它不處理的情況下userSuppliedFilepath提供。您應該將建議的代碼與以下代碼的完整有效版本進行比較:


func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {

    if userSuppliedFilepath == "" {

        var usr *user.User

        usr, err = user.Current()

        filepath = path.Join(usr.HomeDir, ".myprogram.config.json")

    } else {

        filepath = userSuppliedFilepath

    }


    return

}

現在提議的代碼不再長(相反,它更短了一點)。


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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