亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言func匿名函數(shù)閉包示例詳解

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

前言

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

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

定義

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

package main
import "fmt"
// 函數(shù)的定義
func f1(x int, y int) (ret int) {
   return x + y
}
// 無返回值的函數(shù)
func f2(x int, y int) {
   fmt.Println(x + y)
}
// 沒有參數(shù)也沒有返回值的
func f3() {
   fmt.Println("1111")
}
// 沒有參數(shù) 有返回值的
func f4() int {
   return 4
}
// 返回值可以命名也可以不命名
// 命名的返回值就相當(dāng)于在函數(shù)中聲明一個變量
func f5(x int, y int) (ret int) {
   ret = x + y  //注意:因為已經(jīng)在返回值中聲明了ret,所以這里用= 而不是:= ,避免重復(fù)聲明問題
   return //因為已經(jīng)在函數(shù)體中聲明了ret,所以在return的時候不需要重復(fù)聲明
}
// 多個返回值
func f6() (int, int) {
   return 1, 2
}
// 多個參數(shù)簡寫的方式
// 當(dāng)參數(shù)的類型一致時,可以將連續(xù)的相同參數(shù) 前面參數(shù)的類型省略 比如:
func f7(x, y, z int, a, b string, c, d bool) int {
   return x + y + z
}
// 可變長參數(shù)
// 可變長參數(shù)必須放在函數(shù)參數(shù)的最后
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語言中函數(shù)沒有默認(rèn)參數(shù)的概念
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)
   //延遲函數(shù)測試
   deferDemo()
}

函數(shù)也可以作為函數(shù)的參數(shù)

舉個栗子:

package main
import "fmt"
// 函數(shù)也可以作為函數(shù)參數(shù)的類型
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)
}

打印結(jié)果:

函數(shù)作為函數(shù)的返回值

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

打印結(jié)果:

小結(jié):

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

匿名函數(shù)

匿名函數(shù)就是沒有名字的函數(shù)。匿名函數(shù)多用于實現(xiàn)回調(diào)函數(shù)和閉包。

在Go語言中函數(shù)內(nèi)部不能再像之前那樣定義函數(shù)了,只能定義匿名函數(shù)。

匿名函數(shù)的定義格式如下:

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

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

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

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

閉包

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

舉個栗子

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)
}

打印結(jié)果:

小結(jié): 上面的栗子就是一個典型的閉包結(jié)構(gòu):匿名函數(shù)內(nèi)部包含了他外部的變量x。

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

總結(jié)

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

相關(guān)文章

  • Go語言使用Timeout Context取消任務(wù)的實現(xiàn)

    Go語言使用Timeout Context取消任務(wù)的實現(xiàn)

    本文主要介紹了Go語言使用Timeout Context取消任務(wù)的實現(xiàn),包括基本的任務(wù)取消和控制HTTP客戶端請求的超時,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Go網(wǎng)絡(luò)編程TCP抓包實操示例探究

    Go網(wǎng)絡(luò)編程TCP抓包實操示例探究

    作為一名軟件開發(fā)者,網(wǎng)絡(luò)編程是必備知識,本文通過?Go?語言實現(xiàn)?TCP?套接字編程,并結(jié)合?tcpdump?工具,展示它的三次握手、數(shù)據(jù)傳輸以及四次揮手的過程,幫助讀者更好地理解?TCP?協(xié)議與?Go?網(wǎng)絡(luò)編程
    2024-01-01
  • golang環(huán)形隊列實現(xiàn)代碼示例

    golang環(huán)形隊列實現(xiàn)代碼示例

    這篇文章主要介紹了golang環(huán)形隊列實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Go語言入門之基礎(chǔ)語法和常用特性解析

    Go語言入門之基礎(chǔ)語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎(chǔ)語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • Go結(jié)構(gòu)體指針引發(fā)的值傳遞思考分析

    Go結(jié)構(gòu)體指針引發(fā)的值傳遞思考分析

    這篇文章主要為大家介紹了Go結(jié)構(gòu)體指針引發(fā)的值傳遞思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang fmt格式“占位符”的實例用法詳解

    golang fmt格式“占位符”的實例用法詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于golang fmt格式“占位符”的實例用法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-07-07
  • Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸

    這篇文章主要介紹了Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解

    Go語言函數(shù)的延遲調(diào)用(Deferred Code)詳解

    本文將介紹Go語言函數(shù)和方法中的延遲調(diào)用,正如名稱一樣,這部分定義不會立即執(zhí)行,一般會在函數(shù)返回前再被調(diào)用,我們通過一些示例來了解一下延遲調(diào)用的使用場景
    2022-07-07
  • Go語言中init函數(shù)特點、用途和注意事項詳解

    Go語言中init函數(shù)特點、用途和注意事項詳解

    go語言中有一個非常神奇的函數(shù)init,它可以在所有程序執(zhí)行開始前被執(zhí)行,并且每個package下面可以存在多個init函數(shù),這篇文章主要給大家介紹了關(guān)于Go語言中init函數(shù)特點、用途和注意事項的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • grpc入門Unary模式使用方法示例教程

    grpc入門Unary模式使用方法示例教程

    這篇文章主要為大家介紹了grpc入門Unary模式使用方法示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論