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

Golang中的閉包(Closures)詳解

 更新時(shí)間:2023年07月13日 09:08:31   作者:路多辛  
在?Golang?中,閉包是一個(gè)引用了作用域之外的變量的函數(shù),Golang?中的匿名函數(shù)也被稱為閉包,閉包可以被認(rèn)為是一種特殊類型的匿名函數(shù),所以本文就給大家詳細(xì)的介紹一下Golang的閉包到底是什么,感興趣的小伙伴跟著小編一起來看看吧

在講解閉包之前先看一下 Golang 中的匿名函數(shù)。

匿名函數(shù)(Anonymous Functions)

匿名函數(shù)也可以稱為函數(shù)字面量、lambda 函數(shù)或者閉包。閉包的概念起源于 lambda 微積分中表達(dá)式的數(shù)學(xué)求值。從技術(shù)上講,匿名函數(shù)和閉包之間有細(xì)微的區(qū)別:匿名函數(shù)是沒有名稱的函數(shù),而閉包則是函數(shù)的實(shí)例。在 Golang 中要實(shí)現(xiàn)閉包,是離不開匿名函數(shù)的。

先看一個(gè)普通函數(shù)的例子,例如:

func add(x, y int) {
	fmt.Println(x + y)
}

調(diào)用方式如下:

add(1, 2) // 輸出 3

接下來看下如何使用匿名函數(shù)來實(shí)現(xiàn)相同的功能:

func(x, y int) {
		fmt.Println(x + y)
	}(1, 2)

這個(gè)匿名函數(shù)和上面的普通的函數(shù)的功能是一樣的,區(qū)別是

  • 沒有名字
  • 定義之后就直接調(diào)用

接下來,使用通過創(chuàng)建一個(gè)返回一個(gè)函數(shù)的函數(shù)的方式來使用一個(gè)匿名函數(shù)。函數(shù)一般都是返回整數(shù)、字符串、結(jié)構(gòu)體等基本類型,但是在 Golang 中一個(gè)函數(shù)可以返回另一個(gè)函數(shù)。如下是 Golang 官方的一個(gè)例子:

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

這個(gè)函數(shù)的返回類型是 func(int) int 類型的函數(shù),可以將這個(gè)函數(shù)的返回值賦值給一個(gè)變量,然后可以像調(diào)用一個(gè)函數(shù)的方式使用調(diào)用這個(gè)變量,例如:

pos := adder()
pos(1)

閉包(Closures)

通過上文的講解我們已經(jīng)知道了匿名函數(shù)的定義以及使用方式,也了解了一個(gè)函數(shù)可以返回另一個(gè)函數(shù),接下來講解下閉包。

在 Golang 中,閉包是一個(gè)引用了作用域之外的變量的函數(shù)。閉包的存在時(shí)間可以超過創(chuàng)建它的作用域,因此它可以訪問該作用域中的變量,即使在該作用域被銷毀之后。上文中的 adder() 函數(shù)返回的就是一個(gè)典型的閉包。

Golang 中的匿名函數(shù)也被稱為閉包,匿名函數(shù)是一種特殊類型的函數(shù),沒有名稱,閉包可以被認(rèn)為是一種特殊類型的匿名函數(shù)。

Golang 中的閉包由兩部分組成:函數(shù)體和函數(shù)執(zhí)行時(shí)的上下文環(huán)境。函數(shù)體定義了閉包的邏輯,上下文環(huán)境則包含了函數(shù)外部的變量。當(dāng)閉包被創(chuàng)建時(shí),會將外部變量的引用保存在上下文環(huán)境中,并且在函數(shù)體內(nèi)部可以隨時(shí)訪問這些外部變量??磦€(gè)將上文中的 adder() 函數(shù)稍作修改的例子:

package main
import "fmt"
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		fmt.Println("執(zhí)行前 sum =", sum)
		sum += x
		return sum
	}
}
func main() {
	pos := adder()
	for i := 0; i < 4; i++ {
		fmt.Println("執(zhí)行后 sum =", pos(1))
	}
}

運(yùn)行結(jié)果如下:

執(zhí)行前 sum = 0
執(zhí)行后 sum = 1
執(zhí)行前 sum = 1
執(zhí)行后 sum = 2
執(zhí)行前 sum = 2
執(zhí)行后 sum = 3
執(zhí)行前 sum = 3
執(zhí)行后 sum = 4

可以看出,閉包函數(shù)引用的外部變量被保存在了上下文環(huán)境中(一直不被銷毀),每次執(zhí)行閉包,閉包內(nèi)的變量又保存了上一次運(yùn)行后的值。

小結(jié)

閉包是來源于函數(shù)式編程語言的一種特性,函數(shù)既可以返回一個(gè)函數(shù)、也可以接受一個(gè)函數(shù)作為參數(shù)(這種函數(shù)被稱為高階函數(shù))。Golang也支持函數(shù)式編程,閉包在Golang 中有非常廣泛的使用,并且經(jīng)常與Goroutine 和 channel 一起使用。

到此這篇關(guān)于Golang中的閉包(Closures)詳解的文章就介紹到這了,更多相關(guān)Golang閉包(Closures)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang實(shí)踐筆錄之讀取yaml配置文件

    Golang實(shí)踐筆錄之讀取yaml配置文件

    YAML是YAML?Ain't?a?Markup?Language的縮寫,YAML不是一種標(biāo)記語言,相比JSON格式的方便,這篇文章主要給大家介紹了關(guān)于Golang實(shí)踐筆錄之讀取yaml配置文件的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 用Go快速上手Protocol Buffers詳解

    用Go快速上手Protocol Buffers詳解

    Protobuf是一種高效的跨語言序列化協(xié)議,適用于Go語言,本文介紹了如何安裝和使用Protobuf,包括定義協(xié)議、生成Go代碼、序列化和反序列化,以及版本演進(jìn)和兼容性,通過一個(gè)完整的示例,展示了如何在Go項(xiàng)目中使用Protobuf
    2025-11-11
  • 使用Go語言實(shí)現(xiàn)HTTP客戶端請求并解析響應(yīng)的完整流程

    使用Go語言實(shí)現(xiàn)HTTP客戶端請求并解析響應(yīng)的完整流程

    在日常開發(fā)中,無論是調(diào)用 RESTful API、采集網(wǎng)頁數(shù)據(jù),還是進(jìn)行微服務(wù)之間的通信,HTTP 客戶端幾乎無處不在,本文聚焦于如何使用 Go 實(shí)現(xiàn)一個(gè) HTTP 客戶端,完成請求發(fā)送、響應(yīng)解析、錯(cuò)誤處理、Header與Body提取等完整流程,需要的朋友可以參考下
    2025-08-08
  • 快速掌握Go語言正/反向代理

    快速掌握Go語言正/反向代理

    這篇文章主要介紹了快速掌握Go語言正/反向代理的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go 超時(shí)控制:context 與 timeout從實(shí)戰(zhàn)到原理解析

    Go 超時(shí)控制:context 與 timeout從實(shí)戰(zhàn)到原理解析

    本文主要講解了Go語言中使用context進(jìn)行超時(shí)控制的核心概念、使用方法、常見錯(cuò)誤與坑以及底層實(shí)現(xiàn)原理,context用于管理生命周期,通過控制信號傳播機(jī)制優(yōu)雅地終止任務(wù),示例展示了其在HTTP請求、goroutine控制、多層調(diào)用鏈中的應(yīng)用,總結(jié)了常見錯(cuò)誤并提供了最佳實(shí)踐
    2026-05-05
  • 淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition

    淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition

    在并發(fā)編程中,數(shù)據(jù)競爭?(Data?Race)?和?競態(tài)條件?(Race?Condition)?是兩個(gè)常見的問題,本文將簡單介紹一下二者如何避免,有需要的可以了解下
    2025-01-01
  • 基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題

    基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題

    這篇文章主要給大家介紹了使用Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例

    這篇文章主要介紹了Go語言在終端打開實(shí)現(xiàn)進(jìn)度條處理數(shù)據(jù)方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    Go語言的反射機(jī)制進(jìn)階實(shí)現(xiàn)

    反射是Go語言的一個(gè)強(qiáng)大特性,它允許程序在運(yùn)行時(shí)檢查和操作變量、接口和結(jié)構(gòu)體,本文就來詳細(xì)的介紹一下Go語言的反射機(jī)制的實(shí)現(xiàn),感興趣的可以了解一下
    2026-04-04
  • Go語言數(shù)據(jù)結(jié)構(gòu)之二叉樹可視化詳解

    Go語言數(shù)據(jù)結(jié)構(gòu)之二叉樹可視化詳解

    這篇文章主要為大家詳細(xì)介紹了Go語言數(shù)據(jù)結(jié)構(gòu)中二叉樹可視化的方法詳解,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09

最新評論

和政县| 乌拉特中旗| 宜章县| 铜川市| 祁连县| 津南区| 新巴尔虎右旗| 鄂托克前旗| 平湖市| 饶河县| 永泰县| 临洮县| 洛隆县| 揭东县| 城固县| 定陶县| 兴化市| 英德市| 永吉县| 大悟县| 博湖县| 宜章县| 施秉县| 英吉沙县| 巴南区| 攀枝花市| 塔河县| 大冶市| 安图县| 永和县| 乐都县| 井研县| 万州区| 治县。| 华宁县| 亳州市| 扎鲁特旗| 道真| 额敏县| 汕尾市| 武邑县|