這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān) return如何正確的在golang中使用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)公司從2013年開始,先為永泰等服務(wù)建站,永泰等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為永泰企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。golang函數(shù)如果返回值定義了變量,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、返回值之間執(zhí)行順序的坑
Go語言中延遲函數(shù)defer充當(dāng)著 cry...catch 的重任,使用起來也非常簡便,然而在實際應(yīng)用中,很多gopher并沒有真正搞明白defer、return和返回值之間的執(zhí)行順序,從而掉進坑中,今天我們就來揭開它的神秘面紗!
先來運行下面兩段代碼:
A. 無名返回值的情況
package main import ( "fmt" ) func main() { fmt.Println("return:", a()) // 打印結(jié)果為 return: 0 } func a() int { var i int defer func() { i++ fmt.Println("defer2:", i) // 打印結(jié)果為 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印結(jié)果為 defer: 1 }() return i }<br><br>
B. 有名返回值的情況
package main import ( "fmt" ) func main() { fmt.Println("return:", b()) // 打印結(jié)果為 return: 2 } func b() (i int) { defer func() { i++ fmt.Println("defer2:", i) // 打印結(jié)果為 defer: 2 }() defer func() { i++ fmt.Println("defer1:", i) // 打印結(jié)果為 defer: 1 }() return i // 或者直接 return 效果相同 }
先來假設(shè)出結(jié)論,幫助大家理解原因:
1、多個defer的執(zhí)行順序為“后進先出”;
2、defer、return、返回值三者的執(zhí)行邏輯應(yīng)該是:return最先執(zhí)行,return負責(zé)將結(jié)果寫入返回值中;接著defer開始執(zhí)行一些收尾工作;最后函數(shù)攜帶當(dāng)前返回值退出。
如何解釋兩種結(jié)果的不同:
上面兩段代碼的返回結(jié)果之所以不同,其實從上面第2條結(jié)論很好理解。
a()int 函數(shù)的返回值沒有被提前聲名,其值來自于其他變量的賦值,而defer中修改的也是其他變量,而非返回值本身,因此函數(shù)退出時返回值并沒有被改變。
b()(i int) 函數(shù)的返回值被提前聲名,也就意味著defer中是可以調(diào)用到真實返回值的,因此defer在return賦值返回值 i 之后,再一次地修改了 i 的值,最終函數(shù)退出后的返回值才會是defer修改過的值。
C. 下面我們再來看第三個例子,驗證上面的結(jié)論:
package main import ( "fmt" ) func main() { fmt.Println("c return:", *(c())) // 打印結(jié)果為 c return: 2 } func c() *int { var i int defer func() { i++ fmt.Println("c defer2:", i) // 打印結(jié)果為 c defer: 2 }() defer func() { i++ fmt.Println("c defer1:", i) // 打印結(jié)果為 c defer: 1 }() return &i }
雖然 c()*int 的返回值沒有被提前聲明,但是由于 c()*int 的返回值是指針變量,那么在return將變量 i 的地址賦給返回值后,defer再次修改了 i 在內(nèi)存中的實際值,因此函數(shù)退出時返回值雖然依舊是原來的指針地址,但是其指向的內(nèi)存實際值已經(jīng)被成功修改了。
上述就是小編為大家分享的 return如何正確的在golang中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
本文名稱:return如何正確的在golang中使用-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://vcdvsql.cn/article18/cdgcgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、面包屑導(dǎo)航、標簽優(yōu)化、企業(yè)網(wǎng)站制作、做網(wǎng)站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容