AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Go語言中的閉包:封裝數(shù)據(jù)與功能的強大工具

來源: 責編: 時間:2023-11-01 17:04:27 297觀看
導讀閉包是包括 Go 在內的編程語言的一項強大功能。通過閉包,您可以在函數(shù)中封裝數(shù)據(jù),并通過函數(shù)的返回值訪問這些數(shù)據(jù)。在本文中,我們將介紹 Go 中閉包的基礎知識,包括它們是什么、如何工作以及如何有效地使用它們。什么是閉

閉包是包括 Go 在內的編程語言的一項強大功能。通過閉包,您可以在函數(shù)中封裝數(shù)據(jù),并通過函數(shù)的返回值訪問這些數(shù)據(jù)。在本文中,我們將介紹 Go 中閉包的基礎知識,包括它們是什么、如何工作以及如何有效地使用它們。0JD28資訊網——每日最新資訊28at.com

什么是閉包?

go官方有一句解釋:0JD28資訊網——每日最新資訊28at.com

Function literals are closures: they may refer to variables defined in a surrounding function. Those variables are then shared between the surrounding function and the function literal, and they survive as long as they are accessible.0JD28資訊網——每日最新資訊28at.com

翻譯過來就是:0JD28資訊網——每日最新資訊28at.com

函數(shù)字面量(匿名函數(shù))是閉包:它們可以引用在周圍函數(shù)中定義的變量。然后,這些變量在周圍的函數(shù)和函數(shù)字面量之間共享,只要它們還可以訪問,它們就會繼續(xù)存在。0JD28資訊網——每日最新資訊28at.com

閉包是一種創(chuàng)建函數(shù)的方法,這些函數(shù)可以訪問在其主體之外定義的變量。閉包是一個可以捕捉其周圍環(huán)境狀態(tài)的函數(shù)。這意味著函數(shù)可以訪問不在其參數(shù)列表中或在其主體中定義的變量。閉包函數(shù)可以在外部函數(shù)返回后訪問這些變量。0JD28資訊網——每日最新資訊28at.com

在 Go 中創(chuàng)建閉包

在 Go 中,您可以使用匿名函數(shù)創(chuàng)建閉包。創(chuàng)建閉包時,函數(shù)會捕獲其周圍環(huán)境的狀態(tài),包括外部函數(shù)中定義的任何變量。閉包函數(shù)可以在外部函數(shù)返回后訪問這些變量。0JD28資訊網——每日最新資訊28at.com

下面是一個在 Go 中創(chuàng)建閉包的示例:0JD28資訊網——每日最新資訊28at.com

func adder() func(int) int { // 外部函數(shù) sum := 0 return func(x int) int { // 內部函數(shù)  fmt.Println("func sum: ", sum)  sum += x  return sum }}func main() { a := adder() fmt.Println(a(1)) fmt.Println(a(2)) fmt.Println(a(3))}

在本例中,我們定義了一個返回匿名函數(shù)的加法器函數(shù)。匿名函數(shù)捕捉加法器函數(shù)中定義的 sum 變量的狀態(tài)。每次調用匿名函數(shù)時,它都會將參數(shù)加到求和變量中,并返回結果。0JD28資訊網——每日最新資訊28at.com

所以其輸出結果為:0JD28資訊網——每日最新資訊28at.com

func sum:  01func sum:  13func sum:  36

在 Go 中使用閉包

在 Go 中,閉包可用于多種用途,包括用函數(shù)封裝數(shù)據(jù)、創(chuàng)建生成器、迭代器和 memoization 函數(shù)。0JD28資訊網——每日最新資訊28at.com

下面是一個使用閉包將數(shù)據(jù)與函數(shù)封裝在一起的示例:0JD28資訊網——每日最新資訊28at.com

func makeGreeter(greeting string) func(string) string { return func(name string) string {  fmt.Printf("func greeting: %s, name: %s/n", greeting, name)  return greeting + ", " + name }}func main() { englishGreeter := makeGreeter("Hello") spanishGreeter := makeGreeter("Hola") fmt.Println(englishGreeter("John")) fmt.Println(englishGreeter("Tim")) fmt.Println(spanishGreeter("Juan")) fmt.Println(spanishGreeter("Taylor"))}

在本例中,我們定義了一個名為 makeGreeter 的函數(shù),它返回一個匿名函數(shù)。該匿名函數(shù)接收一個字符串參數(shù),并返回一個將問候語和名稱連接起來的字符串。我們創(chuàng)建了兩個問候語程序,一個用于英語,一個用于西班牙語,然后用不同的名稱調用它們。0JD28資訊網——每日最新資訊28at.com

所以其輸出為:0JD28資訊網——每日最新資訊28at.com

func greeting: Hello, name: JohnHello, Johnfunc greeting: Hello, name: TimHello, Timfunc greeting: Hola, name: JuanHola, Juanfunc greeting: Hola, name: TaylorHola, Taylor

替換捕獲的變量

Go 閉包的強大功能之一是能夠更改捕獲的變量。這使得代碼中的行為更加靈活和動態(tài)。下面是一個例子:0JD28資訊網——每日最新資訊28at.com

func makeCounter() func() int { i := 0 return func() int {  fmt.Println("func i: ", i)  i++  return i }}func main() { counter := makeCounter() fmt.Println(counter()) fmt.Println(counter()) fmt.Println(counter())}

在本例中,makeCounter 函數(shù)返回一個閉包,每次調用都會使計數(shù)器遞增。i 變量被閉包捕獲,并可被修改以更新計數(shù)器。0JD28資訊網——每日最新資訊28at.com

所以其輸出為:0JD28資訊網——每日最新資訊28at.com

func i:  01func i:  12func i:  23

逃逸變量

Go 閉包的另一個高級概念是變量逃逸分析。在 Go 中,變量通常在堆棧上分配,并在超出作用域時被去分配。然而,當變量被閉包捕獲時,它必須在堆上分配,以確保在函數(shù)返回后可以訪問它。這會導致性能開銷,因此了解變量何時以及如何逃逸非常重要。0JD28資訊網——每日最新資訊28at.com

我們對比一下兩個方法:0JD28資訊網——每日最新資訊28at.com

func makeAdder1(x1 int) func(int) int { return func(y1 int) int {  return x1 + y1 }}func makeAdder2(x2 int) func(int) int { fmt.Println(x2) return func(y2 int) int {  return x2 + y2 }}func main() { a := makeAdder1(5) fmt.Println(a(1)) b := makeAdder2(6) fmt.Println(b(1))}

makeAdder1 和 makeAdder2 的區(qū)別在于函數(shù)內的 x 是否被使用。0JD28資訊網——每日最新資訊28at.com

而我們通過逃逸分析:0JD28資訊網——每日最新資訊28at.com

go build -gcflags "-m" main.go

會得到以下輸出:0JD28資訊網——每日最新資訊28at.com

./main.go:5:6: can inline makeAdder1./main.go:6:9: can inline makeAdder1.func1./main.go:13:9: can inline makeAdder2.func1./main.go:12:13: inlining call to fmt.Println./main.go:19:17: inlining call to makeAdder1./main.go:6:9: can inline main.makeAdder1.func1./main.go:20:15: inlining call to main.makeAdder1.func1./main.go:20:13: inlining call to fmt.Println./main.go:23:13: inlining call to fmt.Println./main.go:6:9: func literal escapes to heap./main.go:12:13: ... argument does not escape./main.go:12:14: x2 escapes to heap./main.go:13:9: func literal escapes to heap./main.go:19:17: func literal does not escape./main.go:20:13: ... argument does not escape./main.go:20:15: ~R0 escapes to heap./main.go:23:13: ... argument does not escape./main.go:23:15: b(1) escapes to heap

從逃逸分析結果來看,x 變量被閉包捕獲,必須在堆上分配。不過,如果 x 變量不被閉包之外的任何其他代碼使用,編譯器可以進行優(yōu)化,將其分配到棧中。0JD28資訊網——每日最新資訊28at.com

共享閉包

最后,Go 中的閉包可以在多個函數(shù)之間共享,從而實現(xiàn)更高的靈活性和模塊化代碼。下面是一個例子:0JD28資訊網——每日最新資訊28at.com

type Calculator struct { add func(int, int) int}func NewCalculator() *Calculator { c := &Calculator{} c.add = func(x, y int) int {  fmt.Printf("func x: %d, y: %d/n", x, y)  return x + y } return c}func (c *Calculator) Add(x, y int) int { return c.add(x, y)}func main() { calc := NewCalculator() fmt.Println(calc.Add(1, 2)) fmt.Println(calc.Add(2, 3))}

在本例中,Calculator 結構具有一個 add 函數(shù),該函數(shù)在 NewCalculator 函數(shù)中通過閉包進行了初始化。Calculator 結構的 Add 方法只需調用 add 函數(shù),這樣就可以在多個上下文中重復使用。0JD28資訊網——每日最新資訊28at.com

所以其輸出為:0JD28資訊網——每日最新資訊28at.com

func x: 1, y: 23func x: 2, y: 35

結論

在 Go 編程中,閉包是一個強大的工具,可用于用函數(shù)封裝數(shù)據(jù),并創(chuàng)建生成器和迭代器等。它們提供了一種訪問函數(shù)體外定義的變量的方法,即使在函數(shù)返回后也是如此。0JD28資訊網——每日最新資訊28at.com


0JD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-16368-0.htmlGo語言中的閉包:封裝數(shù)據(jù)與功能的強大工具

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust編程基礎之六大數(shù)據(jù)類型

下一篇: 你知道 Python 其實自帶了小型數(shù)據(jù)庫嗎

標簽:
  • 熱門焦點
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 6月iOS設備性能榜:M2穩(wěn)居榜首 A系列只能等一手3nm來救

    沒有新品發(fā)布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發(fā)布節(jié)奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • 6月安卓手機好評榜:魅族20 Pro蟬聯(lián)冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 把LangChain跑起來的三個方法

    使用LangChain開發(fā)LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了——貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • 聯(lián)想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯(lián)想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發(fā)布會前給出了機型的所有參數(shù)。聯(lián)想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
  • 利用職權私自解除被封帳號 Meta開除20多名員工

    11月18日消息,據(jù)外媒援引知情人士表示,過去一年時間內,F(xiàn)acebook母公司Meta解雇或處罰了20多名員工以及合同工,指控這些人通過內部系統(tǒng)以不當方式重置用戶帳號,其
Top