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

Golang中的閉包(Closures)詳解

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

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

匿名函數(Anonymous Functions)

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

先看一個普通函數的例子,例如:

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

調用方式如下:

add(1, 2) // 輸出 3

接下來看下如何使用匿名函數來實現相同的功能:

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

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

  • 沒有名字
  • 定義之后就直接調用

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

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

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

pos := adder()
pos(1)

閉包(Closures)

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

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

Golang 中的匿名函數也被稱為閉包,匿名函數是一種特殊類型的函數,沒有名稱,閉包可以被認為是一種特殊類型的匿名函數。

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

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

運行結果如下:

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

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

小結

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

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

相關文章

  • 基于golang channel實現的輕量級異步任務分發(fā)器示例代碼

    基于golang channel實現的輕量級異步任務分發(fā)器示例代碼

    這篇文章主要給大家介紹了關于基于golang channel實現的輕量級異步任務分發(fā)器的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • GO語言函數(func)的聲明與使用詳解

    GO語言函數(func)的聲明與使用詳解

    這篇文章主要介紹了GO函數(func)的聲明與使用,包括了GO語言函數聲明與使用,GO語言遞歸函數,GO語言內置函數,GO語言函數defer應用,GO語言函數可變長度參數需要的朋友可以參考下
    2022-12-12
  • Go語言通過http抓取網頁的方法

    Go語言通過http抓取網頁的方法

    這篇文章主要介紹了Go語言通過http抓取網頁的方法,實例分析了Go語言通過http操作頁面的技巧,需要的朋友可以參考下
    2015-03-03
  • golang中for range的取地址操作陷阱介紹

    golang中for range的取地址操作陷阱介紹

    這篇文章主要介紹了golang中for range的取地址操作陷阱,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go語言接口之接口值舉例詳解

    go語言接口之接口值舉例詳解

    接口是一種抽象類型,是對其他類型行為的概括與抽象,從語法角度來看,接口是一組方法定義的集合,下面這篇文章主要給大家介紹了關于go語言接口之接口值的相關資料,文章通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 利用Go語言實現簡單Ping過程的方法

    利用Go語言實現簡單Ping過程的方法

    相信利用各種語言實現Ping已經是大家喜聞樂見的事情了,網絡上利用Golang實現Ping已經有比較詳細的代碼示例,但大多是僅僅是實現了Request過程,而對Response的回顯內容并沒有做接收。而Ping程序不僅僅是發(fā)送一個ICMP,更重要的是如何接收并進行統計。
    2016-09-09
  • 深入理解Golang?Channel?的底層結構

    深入理解Golang?Channel?的底層結構

    這篇文章主要介紹了深入理解Golang?Channel?的底層結構,Go?語言的?channel?底層是什么數據結構?下面我們就一起來深入解析一下?channel,需要的朋友可以參考下
    2022-01-01
  • 詳解golang中模板的常用語法

    詳解golang中模板的常用語法

    這篇文章主要介紹了golang模板中的常用語法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • golang端口占用檢測的使用

    golang端口占用檢測的使用

    這篇文章主要介紹了golang端口占用檢測的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 解決golang讀取http的body時遇到的坑

    解決golang讀取http的body時遇到的坑

    這篇文章主要介紹了解決golang讀取http的body時遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論