最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言func匿名函數閉包示例詳解

 更新時間:2022年06月13日 10:03:26   作者:王中陽Go  
這篇文章主要為大家介紹了Go語言func匿名函數閉包示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

今天繼續(xù)為大家更新Go語言學習記錄的文章。

函數是任何一門編程語言最重要的組成部分之一。函數簡單理解是一段代碼的封裝:把一段邏輯抽象出來封裝到一個函數中,給他取個名字,每次需要的時候調用這個函數即可。使用函數能夠讓代碼更清晰,更簡潔。

定義

下面的代碼段介紹了go語言中函數定義的各種情況,以及延遲函數的使用。

package main
import "fmt"
// 函數的定義
func f1(x int, y int) (ret int) {
   return x + y
}
// 無返回值的函數
func f2(x int, y int) {
   fmt.Println(x + y)
}
// 沒有參數也沒有返回值的
func f3() {
   fmt.Println("1111")
}
// 沒有參數 有返回值的
func f4() int {
   return 4
}
// 返回值可以命名也可以不命名
// 命名的返回值就相當于在函數中聲明一個變量
func f5(x int, y int) (ret int) {
   ret = x + y  //注意:因為已經在返回值中聲明了ret,所以這里用= 而不是:= ,避免重復聲明問題
   return //因為已經在函數體中聲明了ret,所以在return的時候不需要重復聲明
}
// 多個返回值
func f6() (int, int) {
   return 1, 2
}
// 多個參數簡寫的方式
// 當參數的類型一致時,可以將連續(xù)的相同參數 前面參數的類型省略 比如:
func f7(x, y, z int, a, b string, c, d bool) int {
   return x + y + z
}
// 可變長參數
// 可變長參數必須放在函數參數的最后
func f8(x string, y ...int) {
   fmt.Println(x)
   fmt.Println(y)
}
// defer 延遲執(zhí)行
func deferDemo() {
   defer fmt.Println("111") //最先defer的語句最后執(zhí)行
   defer fmt.Println("222")
   fmt.Println("333")
}
// go語言中函數沒有默認參數的概念
func main() {
   r := f5(1, 2)
   fmt.Println(r)
   m, n := f6()
   fmt.Println(m, n)
   r7 := f7(1, 2, 3, "1", "1", true, false)
   fmt.Println(r7)
   f8("hah") //可變長度 不填也可以
   f8("hah", 1, 2, 3, 4)
   //延遲函數測試
   deferDemo()
}

函數也可以作為函數的參數

舉個栗子:

package main
import "fmt"
// 函數也可以作為函數參數的類型
func f3(x func() int) {
   ret := x()
   fmt.Printf("f3打印ret的值:%v\n", ret) //2
   fmt.Printf("f3打印ret的類型:%T\n", ret) //int
}
func main() {
   a := f2
   fmt.Printf("a的類型:%T\n", a)
   f3(a)
}

打印結果:

函數作為函數的返回值

package main
import "fmt"
func f2() int {
   return 2
}
func ff(x, y int) int {
   return x + y
}
// 函數不僅可以作為參數,還可以作為返回值
func f5(x func() int) func(int, int) int {
   return ff
}
func main() {
   f7 := f5(f2)
   fmt.Printf("f7的值:%v\n",f7) //f7返回的是一個函數
   fmt.Printf("f7的類型:%T\n", f7)
}

打印結果:

小結:

  • 我們打印f7的值是一個內存地址
  • f7的類型和我們預期的一致,返回了函數類型,就是我們定義的ff()函數

匿名函數

匿名函數就是沒有名字的函數。匿名函數多用于實現回調函數和閉包。

在Go語言中函數內部不能再像之前那樣定義函數了,只能定義匿名函數。

匿名函數的定義格式如下:

func(參數)(返回值){
    函數體
}

匿名函數因為沒有函數名,所以沒辦法像普通函數那樣調用,所以匿名函數需要保存到某個變量或者作為立即執(zhí)行函數:

func main() {
	// 將匿名函數保存到變量
	add := func(x, y int) {
		fmt.Println(x + y)
	}
	add(10, 20) // 通過變量調用匿名函數
	//自執(zhí)行函數:匿名函數定義完加()直接執(zhí)行
	func(x, y int) {
		fmt.Println(x + y)
	}(10, 20)
}

小結:自執(zhí)行函數就是在匿名函數后面追加(),表示不需要外部調用,直接執(zhí)行。

閉包

閉包是一個函數,這個函數包含了他外部作用域的一個變量

舉個栗子

package main
import "fmt"
func adder(x int) func(int) int {
   return func(y int) int {
      x += y
      return x
   }
}
func main() {
   f1 := adder(1)
   ret := f1(2)
   fmt.Println(ret)
}

打印結果:

小結: 上面的栗子就是一個典型的閉包結構:匿名函數內部包含了他外部的變量x。

閉包=函數+引用環(huán)境

總結

這篇文章我們詳細介紹了Go語言中函數的定義、也介紹了匿名函數和閉包的知識點,更多關于Go語言func匿名函數閉包的資料請關注腳本之家其它相關文章!

相關文章

  • 簡單聊聊Golang中defer預計算參數

    簡單聊聊Golang中defer預計算參數

    在golang當中defer代碼塊會在函數調用鏈表中增加一個函數調用,下面這篇文章主要給大家介紹了關于Golang中defer預計算參數的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Go語言基礎go doc命令用法及示例詳解

    Go語言基礎go doc命令用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎go doc命令的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2021-11-11
  • Go語言中defer語句的用法

    Go語言中defer語句的用法

    這篇文章介紹了Go語言中defer語句的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json

    golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json

    這篇文章主要介紹了golang(gin)的全局統(tǒng)一異常處理方式,并統(tǒng)一返回json,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)

    Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn)

    本文主要介紹了Go語言實現一個簡單的并發(fā)聊天室的項目實戰(zhàn),文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • golang fmt占位符的使用詳解

    golang fmt占位符的使用詳解

    這篇文章主要介紹了golang fmt占位符的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang time包中的函數用法詳解

    Golang time包中的函數用法詳解

    在日常開發(fā)過程中,會頻繁遇到對時間進行操作的場景,使用 Golang 中的 time 包可以很方便地實現對時間的相關操作,接下來的幾篇文章會詳細講解 time 包,本文講解一下 time 包中的函數,需要的朋友可以參考下
    2023-08-08
  • 詳解Go使用Viper和YAML管理配置文件

    詳解Go使用Viper和YAML管理配置文件

    在軟件開發(fā)中,配置管理是一項基本但至關重要的任務,它涉及到如何有效地管理應用程序的配置變量,本文將探討如何使用Viper庫配合YAML配置文件來實現高效的配置管理,感興趣的可以了解下
    2024-04-04
  • Golang 按行讀取文件的三種方法小結

    Golang 按行讀取文件的三種方法小結

    本文主要介紹了Golang 按行讀取文件的三種方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Go語言基礎知識點介紹

    Go語言基礎知識點介紹

    在本篇文章里小編給大家整理的是一篇關于Go語言基礎知識點介紹內容,有興趣的朋友們可以跟著學習參考下。
    2021-07-07

最新評論

青铜峡市| 资兴市| 新安县| 顺平县| 珲春市| 禄劝| 迭部县| 磐石市| 白水县| 治县。| 当阳市| 塔城市| 丹江口市| 杨浦区| 洛南县| 分宜县| 乃东县| 图片| 长乐市| 布拖县| 南投市| 法库县| 天全县| 丰县| 修水县| 新邵县| 鄯善县| 临夏市| 佳木斯市| 石阡县| 南岸区| 松潘县| 洛川县| 丽江市| 日土县| 深水埗区| 利津县| 福鼎市| 龙井市| 安泽县| 五家渠市|