91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

return如何正確的在golang中使用

發布時間:2020-12-16 14:19:38 來源:億速云 閱讀:599 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關 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中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

星子县| 公主岭市| 乐东| 江西省| 泸水县| 武穴市| 周口市| 同德县| 彩票| 安西县| 中超| 嵩明县| 乌苏市| 平阴县| 宁远县| 庄河市| 泗阳县| 沧州市| 定边县| 屯留县| 永新县| 新丰县| 河源市| 米易县| 新营市| 隆尧县| 平果县| 乐平市| 平乐县| 柯坪县| 郸城县| 安吉县| 凭祥市| 六盘水市| 石棉县| 宁城县| 大庆市| 平乡县| 大同市| 虹口区| 疏勒县|