第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Go 入門教程

Go 語言基礎(chǔ)教程
01 Go語言簡(jiǎn)介 02 Go 在 Windows 上的安裝及配置 03 Go 在 Linux 上的安裝與配置 04 Go 在 MacOS 上的安裝及配置 05 Git 的下載和安裝 06 VSCode 編輯器安裝和配置 07 Go 的變量聲明 08 Go 的變量賦值 09 Go 語言的 := 10 Go 的整型(int) 11 Go 的無符號(hào)整型(uint) 12 Go 的浮點(diǎn)型(float) 13 Go 的字符類型 14 Go 的布爾型(bool) 15 Go 的強(qiáng)制類型轉(zhuǎn)換 16 Go 語言的常量 17 Go 語言中代替枚舉的辦法 18 Go 語言中的運(yùn)算符 19 Go 語言的分支語句 20 Go 語言的循環(huán)語句 21 Go 語言的通道 22 Go 語言中的函數(shù) 23 Go 語言函數(shù)中的 defer 24 Go 語言中的閉包 25 Go 語言的指針 26 Go 語言中的數(shù)組 27 Go 語言中的切片 28 Go 語言中的 Map 29 Go 語言中的 range 30 Go 語言拓展以有類型 31 Go 語言中的結(jié)構(gòu)體和"面向?qū)ο?quot; 32 Go 語言中的接口 33 Go 語言類型的內(nèi)嵌 34 Go 語言中的 nil 35 Go 語言函數(shù)式編程 36 Go 語言中的錯(cuò)誤和異常處理 37 Go 語言的并發(fā) 38 Go 語言中的包 39 Go 語言 go mod 包依賴管理工具 40 Go 語言的文件操作 41 Go 語言中的系統(tǒng)包 42 Go 語言的 strings 系統(tǒng)包的使用 43 Go 語言中的變參 44 Go 語言中的反射 45 Go 語言性能測(cè)試 46 使用 Go 語言搭建簡(jiǎn)易登錄功能 47 使用 gin 包優(yōu)化登錄功能

Go 語言中的閉包

本文主要介紹 Go 語言中的閉包。簡(jiǎn)單的說 Go 語言的閉包就是一個(gè)引用了外部自由變量匿名函數(shù),被引用的自由變量和該匿名函數(shù)共同存在,不會(huì)因?yàn)殡x開了外部環(huán)境就被釋放或者刪除,還可以在這個(gè)匿名函數(shù)中繼續(xù)使用。

1. Go 語言的匿名函數(shù)

在上文中我們了解到了一個(gè)新的詞匯——匿名函數(shù),我們先來學(xué)習(xí)一下Go語言中的匿名函數(shù),再來了解在 Go 語言中如何使用閉包。匿名函數(shù),顧名思義,就是隱藏函數(shù)名的函數(shù)。

代碼示例

package main

import (
    "fmt"
)

var f = func() {
    fmt.Println("匿名函數(shù)作為變量來使用")
}

func main() {
    f()

    func() {
        fmt.Println("匿名函數(shù)直接使用")
    }()
}
  • 第7~9行:定義一個(gè)函數(shù)類型,值為一個(gè)匿名函數(shù)的變量;
  • 第 12 行:使用這個(gè)匿名函數(shù);
  • 第 14~16 行:定義一個(gè)匿名函數(shù)。在這個(gè)函數(shù)后加上(),就可以直接使用這個(gè)匿名函數(shù)。

執(zhí)行結(jié)果

圖片描述

2. 匿名函數(shù)引用外部變量

如果在匿名函數(shù)內(nèi),使用了外部環(huán)境的變量,就構(gòu)成了一個(gè)閉包。簡(jiǎn)單來講就是一個(gè)函數(shù)內(nèi),使用匿名函數(shù)來操作函數(shù)內(nèi)聲明的變量。

代碼示例

package main

import (
    "fmt"
)

func main() {
    str := "Hello World!"
    func() {
        str = "Hello Codey!"
    }()
    fmt.Println(str)
}
  • 第 10 行:匿名函數(shù)直接操作了main函數(shù)之中的變量str,將其修改為了"Hello Codey!";
  • 第 12 行:輸出變量的值。

執(zhí)行結(jié)果

圖片描述

上述例子簡(jiǎn)單的構(gòu)造了一個(gè)閉包,在匿名函數(shù)中并沒有聲明或者定義str這個(gè)變量,但是可以直接操作,就是引用可main函數(shù)中的自由變量。這個(gè)例子可能對(duì)自由變量的引用表現(xiàn)不是很直觀,我們接下來使用defer和閉包相結(jié)合,深入了解一下閉包中的引用外部變量。

代碼示例

package main

import (
    "fmt"
)

func main() {
    str := "Hello World!"
    defer func() {
        fmt.Println("defer str=", str)
    }()
    str = "Hello Codey!"
    fmt.Println("main str=", str)
}

執(zhí)行結(jié)果

圖片描述

從執(zhí)行結(jié)果上來看應(yīng)該是蠻出人意料的,因?yàn)榍拔慕榻B defer 的時(shí)候明確介紹了 defer 后變量是保留它在 defer 時(shí)的值,而不會(huì)被 defer 之后的代碼所改變。但是在閉包這邊這個(gè)看起來不太適用,其實(shí)是適用的,只是閉包是引用了這個(gè)變量,也就是說,在 defer 時(shí)被保留下來的是這個(gè)變量的地址,后續(xù)代碼改變的不是地址,而是這個(gè)地址存儲(chǔ)的值,所以后續(xù)代碼對(duì)這個(gè)變量的操作,都會(huì)反應(yīng)到這個(gè) defer 中。

Tips:關(guān)于變量的地址,在后續(xù)的Go語言的指針中會(huì)有詳細(xì)的介紹。

3. 小結(jié)

本文主要介紹了 Go 語言中閉包的使用,需要注意以下幾點(diǎn):

  • 閉包就是匿名函數(shù)引用外部變量
  • 閉包中引用的變量會(huì)被外部環(huán)境改變,同時(shí)閉包內(nèi)對(duì)變量的改變也會(huì)影響到外部環(huán)境的使