在Go中,您可以編寫具有命名結果參數的函數。
來自的兩個例子規格:
func complexF3() (re float64, im float64) {
re = 7.0
im = 4.0
return
}
func (devnull) Write(p []byte) (n int, _ error) {
n = len(p)
return
}
使用此語法有許多優點。
您不必手動分配返回變量,因為將它們命名為結果類型,當函數開始時它們會自動以其類型的零值初始化。
命名返回參數作為隱式文檔非常出色:您知道函數直接從其簽名返回什麼,因為命名有助於理解代碼。
如果一個函數有多個退出點,則無需編寫所有參數,只需return
(稱為勉強回報)。你還在能夠顯式列出返回的值,並且可能應該這樣做,以防止難以閱讀的代碼。如建議Go編程語言:
[…]有很多return語句和幾個結果,裸返回可以減少代碼重複,但是很少使代碼更易於理解。 […]最好謹慎使用裸露的退貨
一個例子:
func something(n int) (ret int, m string, err error) {
if n == 0 {
err = errors.New("Houston, we have a problem!")
return 0, "", err
}
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>
<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>
}
或無回報:
func something(n int) (ret int, m string, err error) {
if n == 0 {
err = errors.New("Houston, we have a problem!")
return
}
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>
<span style="color:#66d9ef">return</span>
}
在這兩種情況下,代碼都比以下代碼更整潔,更易讀
func something(n int) (int, string, error) {
var ret int
var m string
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">n</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> {
<span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">errors</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">"Houston, we have a problem!"</span>)
<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#a6e22e">err</span>
}
<span style="color:#a6e22e">ret</span> = <span style="color:#a6e22e">n</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">100</span>
<span style="color:#a6e22e">m</span> = <span style="color:#e6db74">"Congratulations"</span>
<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">ret</span>, <span style="color:#a6e22e">m</span>, <span style="color:#66d9ef">nil</span>
}
當心在函數內部使用新的聲明對參數進行陰影處理的風險。
那麼,什麼時候應該使用它們?在程序的整體設計中對您有意義。我讓Go編程語言用報價回复:
[…]不一定總是只為文檔命名多個結果。例如,約定規定最終
bool
結果表明成功;一個error
通常不需要解釋。
其他資源:
- https://golang.org/doc/effective_go.html#named-results
- https://golang.org/ref/spec#Return_statements
- https://stackoverflow.com/questions/45239409/empty-return-in-func-with-return-value-in-golang
更多教程:
- 使用NGINX反向代理服務Go服務
- 在Go中復制結構
- Go Web服務器的基礎
- 在Go中對地圖類型進行排序
- 簡而言之去指針
- 轉到標籤說明
- 開始日期和時間格式
- 使用Go進行JSON處理
- 可變參數函數
- 去弦備忘單
- 轉到空界面說明
- 使用VS Code和Delve調試Go
- 命名為Go返回參數
- 在Go中生成隨機數和字符串
- Go項目的文件系統結構
- Go中的二進制搜索算法
- 在Go中使用命令行標誌
- GOPATH解釋
- 使用Go構建一個命令行應用程序:lolcat
- 使用Go構建CLI命令:Cowsay
- 在Go中使用殼管
- Go CLI教程:財富克隆
- 使用Go列出文件夾中的文件
- 使用Go從GitHub獲取存儲庫列表
- 去,將一小段字符串附加到文件中
- 去,將字符串轉換為字節片
- 使用Go可視化您本地的Git貢獻
- Go CPU和內存分析入門
- 解決Go程序中的“不支持索引”錯誤
- 測量Go程序中的執行時間
- 使用Go構建Web爬網程序以檢測重複的標題
- 最佳實踐:指針還是價值接收者?
- 最佳實踐:您應該使用方法還是函數?
- Go數據結構:集
- 前往地圖備忘單
- 在Go中生成泛型類型的實現
- Go數據結構:字典
- Go數據結構:哈希表
- 在“通過通道”中實現事件偵聽器
- Go數據結構:堆棧
- Go數據結構:隊列
- Go數據結構:二進制搜索樹
- Go數據結構:圖形
- Go數據結構:鍊錶
- Go數據結構的完整指南
- 比較Go值
- Go是面向對象的嗎?
- 在Go中使用SQL數據庫
- 在Go中使用環境變量
- 上篇教程:PostgreSQL支持的REST API
- 在Go Web服務器上啟用CORS
- 在Docker容器中部署Go應用程序
- 為什麼Go是作為PHP開發人員學習的功能強大的語言
- 去,刪除io.Reader.ReadString換行符
- 開始,如何觀看更改並重建程序
- 去算一下自約會以來的月份
- 在Go中訪問HTTP POST參數