您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關 return如何正確的在golang中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
golang函數如果返回值定義了變量,return后邊必須跟著表達式或者值
func main() { fmt.Println("-------", test()) } func test() (n string) { n = "hello" return }
如果沒有定義變量,return必須顯示地返回對象
func main() { fmt.Println("-------", test()) } func test() string { n := "hello" return n }
補充:Golang中defer、return、返回值之間執行順序的坑
Go語言中延遲函數defer充當著 cry...catch 的重任,使用起來也非常簡便,然而在實際應用中,很多gopher并沒有真正搞明白defer、return和返回值之間的執行順序,從而掉進坑中,今天我們就來揭開它的神秘面紗!
先來運行下面兩段代碼:
A. 無名返回值的情況
package main import ( "fmt" ) func main() { fmt.Println("return:", a()) // 打印結果為 return: 0 } func a() int { var i int defer func() { i++ fmt.Println("defer2:", i) // 打印結果為 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印結果為 defer: 1 }() return i }<br><br>
B. 有名返回值的情況
package main import ( "fmt" ) func main() { fmt.Println("return:", b()) // 打印結果為 return: 2 } func b() (i int) { defer func() { i++ fmt.Println("defer2:", i) // 打印結果為 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印結果為 defer: 1 }() return i // 或者直接 return 效果相同 }
先來假設出結論,幫助大家理解原因:
1、多個defer的執行順序為“后進先出”;
2、defer、return、返回值三者的執行邏輯應該是:return最先執行,return負責將結果寫入返回值中;接著defer開始執行一些收尾工作;最后函數攜帶當前返回值退出。
如何解釋兩種結果的不同:
上面兩段代碼的返回結果之所以不同,其實從上面第2條結論很好理解。
a()int 函數的返回值沒有被提前聲名,其值來自于其他變量的賦值,而defer中修改的也是其他變量,而非返回值本身,因此函數退出時返回值并沒有被改變。
b()(i int) 函數的返回值被提前聲名,也就意味著defer中是可以調用到真實返回值的,因此defer在return賦值返回值 i 之后,再一次地修改了 i 的值,最終函數退出后的返回值才會是defer修改過的值。
C. 下面我們再來看第三個例子,驗證上面的結論:
package main import ( "fmt" ) func main() { fmt.Println("c return:", *(c())) // 打印結果為 c return: 2 } func c() *int { var i int defer func() { i++ fmt.Println("c defer2:", i) // 打印結果為 c defer: 2 }() defer func() { i++ fmt.Println("c defer1:", i) // 打印結果為 c defer: 1 }() return &i }
雖然 c()*int 的返回值沒有被提前聲明,但是由于 c()*int 的返回值是指針變量,那么在return將變量 i 的地址賦給返回值后,defer再次修改了 i 在內存中的實際值,因此函數退出時返回值雖然依舊是原來的指針地址,但是其指向的內存實際值已經被成功修改了。
上述就是小編為大家分享的 return如何正確的在golang中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。