欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang return省略用法說明

 更新時間:2020年12月16日 09:05:33   作者:david___  
這篇文章主要介紹了golang return省略用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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、返回值之間執(zhí)行順序的坑

Go語言中延遲函數defer充當著 cry...catch 的重任,使用起來也非常簡便,然而在實際應用中,很多gopher并沒有真正搞明白defer、return和返回值之間的執(zhí)行順序,從而掉進坑中,今天我們就來揭開它的神秘面紗!

先來運行下面兩段代碼:

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的執(zhí)行順序為“后進先出”;

2、defer、return、返回值三者的執(zhí)行邏輯應該是:return最先執(zhí)行,return負責將結果寫入返回值中;接著defer開始執(zhí)行一些收尾工作;最后函數攜帶當前返回值退出。

如何解釋兩種結果的不同:

上面兩段代碼的返回結果之所以不同,其實從上面第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 在內存中的實際值,因此函數退出時返回值雖然依舊是原來的指針地址,但是其指向的內存實際值已經被成功修改了。

即,我們假設的結論是正確的!

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

相關文章

  • Go Gin框架中的binding驗證器使用小結

    Go Gin框架中的binding驗證器使用小結

    Gin框架中的binding驗證器為我們提供了簡便的數據綁定和驗證功能,通過合理使用binding和validate標簽,我們可以確保API接口的數據合法性和完整性,這篇文章主要介紹了Go Gin框架中的binding驗證器使用指南,需要的朋友可以參考下
    2024-07-07
  • Gin框架中的PostForm用法及說明

    Gin框架中的PostForm用法及說明

    這篇文章主要介紹了Gin框架中的PostForm用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Go語言使用GORM操作數據庫使用指南

    Go語言使用GORM操作數據庫使用指南

    GORM(全稱為Go?Object?Relational?Mapping)是一個在Go語言中使用的輕量級的對象關系映射(ORM)庫,本文主要為大家介紹了GORM操作數據庫具體方法,需要的可以參考一下
    2023-05-05
  • Golang實現AES加密和解密的示例代碼

    Golang實現AES加密和解密的示例代碼

    AES( advanced encryption standard)使用相同密鑰進行加密和解密,也就是對稱加密。本文將詳細講解Golang實現AES加密和解密的方法,感興趣的可以學習一下
    2022-05-05
  • Golang?channel關閉后是否可以讀取剩余的數據詳解

    Golang?channel關閉后是否可以讀取剩余的數據詳解

    這篇文章主要介紹了Golang?channel關閉后是否可以讀取剩余的數據,文章通過一個測試例子給大家詳細的介紹了是否可以讀取剩余的數據,需要的朋友可以參考下
    2023-09-09
  • 詳解Go語言中的內存對齊

    詳解Go語言中的內存對齊

    前面我們學習了Go語言空結構體詳解,最近又在看unsafe包的知識,在查閱相關資料時不免會看到內存對齊相關的內容。雖然不會,但可以學呀,那么這篇文章,我們就一起來看下什么是內存對齊吧
    2022-10-10
  • 如何用golang運行第一個項目

    如何用golang運行第一個項目

    這篇文章主要介紹了如何用golang運行第一個項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • golang使用正則表達式解析網頁

    golang使用正則表達式解析網頁

    這篇文章主要介紹了golang使用正則表達式解析網頁,需要的朋友可以參考下
    2015-03-03
  • golang調試bug及性能監(jiān)控方式實踐總結

    golang調試bug及性能監(jiān)控方式實踐總結

    這篇文章主要為大家介紹了golang調試bug及性能監(jiān)控方式實踐是總結,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Golang?Configor配置文件工具的使用詳解

    Golang?Configor配置文件工具的使用詳解

    Configor是一個支持?yaml、json、toml、shell?的配置文件工具,這篇文中主要為大家詳細介紹了Configor的具體使用,感興趣的小伙伴可以學習一下
    2023-08-08

最新評論