婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang return省略用法說明

golang return省略用法說明

熱門標(biāo)簽:貴州電話智能外呼系統(tǒng) 谷歌美發(fā)店地圖標(biāo)注 杭州人工智能電銷機器人費用 官渡電銷外呼管理系統(tǒng)怎么收費 地圖區(qū)域圖標(biāo)注后導(dǎo)出 利用地圖標(biāo)注位置 400開頭電話怎樣申請 赤峰電銷 江蘇呼叫中心外呼系統(tǒng)有效果嗎

golang函數(shù)如果返回值定義了變量,return后邊必須跟著表達(dá)式或者值

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í)行順序,從而掉進(jìn)坑中,今天我們就來揭開它的神秘面紗!

先來運行下面兩段代碼:

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í)行順序為“后進(jìn)先出”;

2、defer、return、返回值三者的執(zhí)行邏輯應(yīng)該是:return最先執(zhí)行,return負(fù)責(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)被成功修改了。

即,我們假設(shè)的結(jié)論是正確的!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 使用Lumberjack+zap進(jìn)行日志切割歸檔操作
  • golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫logrus的詳解
  • golang的time包:秒、毫秒、納秒時間戳輸出方式
  • golang 使用time包獲取時間戳與日期格式化操作
  • golang有用的庫及工具 之 zap.Logger包的使用指南

標(biāo)簽:鷹潭 武漢 泰安 松原 保定 河池 黔西 宜春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang return省略用法說明》,本文關(guān)鍵詞  golang,return,省略,用法,說明,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang return省略用法說明》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang return省略用法說明的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 勃利县| 兴海县| 鱼台县| 玉屏| 久治县| 孝义市| 黎平县| 迁安市| 交口县| 新密市| 泾源县| 景洪市| 鲁甸县| 中西区| 兰考县| 灌阳县| 克什克腾旗| 临安市| 永春县| 武威市| 衡山县| 天镇县| 新竹市| 翁牛特旗| 西宁市| 嵊泗县| 吉木萨尔县| 淮南市| 金昌市| 娄底市| 东至县| 老河口市| 安化县| 新泰市| 桃园市| 翁源县| 甘孜| 寿光市| 灵川县| 兴文县| 岢岚县|