chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

帶你了解go語言中的閉包

Linux愛好者 ? 來源:gitbooks ? 作者:gitbooks ? 2021-11-02 15:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導讀】什么是閉包?什么場景下會用閉包?本文對 go 語言中的閉包做了詳細介紹。

閉包是由函數(shù)及其相關引用環(huán)境組合而成的實體(即:閉包=函數(shù)+引用環(huán)境)。

Go中的閉包

閉包是函數(shù)式語言中的概念,沒有研究過函數(shù)式語言的用戶可能很難理解閉包的強大,相關的概念超出了本書的范圍。Go語言是支持閉包的,這里只是簡單地講一下在Go語言中閉包是如何實現(xiàn)的。

funcf(iint)func()int{
returnfunc()int{
i++
returni
}
}

函數(shù)f返回了一個函數(shù),返回的這個函數(shù),返回的這個函數(shù)就是一個閉包。這個函數(shù)中本身是沒有定義變量i的,而是引用了它所在的環(huán)境(函數(shù)f)中的變量i。

c1:=f(0)
c2:=f(0)
c1()//referencetoi,i=0,return1
c2()//referencetoanotheri,i=0,return1

c1跟c2引用的是不同的環(huán)境,在調用i++時修改的不是同一個i,因此兩次的輸出都是1。函數(shù)f每進入一次,就形成了一個新的環(huán)境,對應的閉包中,函數(shù)都是同一個函數(shù),環(huán)境卻是引用不同的環(huán)境。

變量i是函數(shù)f中的局部變量,假設這個變量是在函數(shù)f的棧中分配的,是不可以的。因為函數(shù)f返回以后,對應的棧就失效了,f返回的那個函數(shù)中變量i就引用一個失效的位置了。所以閉包的環(huán)境中引用的變量不能夠在棧上分配。

escape analyze

在繼續(xù)研究閉包的實現(xiàn)之前,先看一看Go的一個語言特性:

funcf()*Cursor{
varcCursor
c.X=500
noinline()
return&c
}

Cursor是一個結構體,這種寫法在C語言中是不允許的,因為變量c是在棧上分配的,當函數(shù)f返回后c的空間就失效了。但是,在Go語言規(guī)范中有說明,這種寫法在Go語言中合法的。語言會自動地識別出這種情況并在堆上分配c的內存,而不是函數(shù)f的棧上。

為了驗證這一點,可以觀察函數(shù)f生成的匯編代碼:

MOVQ$type."".Cursor+0(SB),(SP)//取變量c的類型,也就是Cursor
PCDATA$0,$16
PCDATA$1,$0
CALL,runtime.new(SB)//調用new函數(shù),相當于new(Cursor)
PCDATA$0,$-1
MOVQ8(SP),AX//取c.X的地址放到AX寄存器
MOVQ$500,(AX)//將AX存放的內存地址的值賦為500
MOVQAX,"".~r0+24(FP)
ADDQ$16,SP

識別出變量需要在堆上分配,是由編譯器的一種叫escape analyze的技術實現(xiàn)的。如果輸入命令:

gobuild--gcflags=-mmain.go

可以看到輸出:

./main.gomovedtoheap:c
./main.go&cescapestoheap

表示c逃逸了,被移到堆中。escape analyze可以分析出變量的作用范圍,這是對垃圾回收很重要的一項技術。

閉包結構體

回到閉包的實現(xiàn)來,前面說過,閉包是函數(shù)和它所引用的環(huán)境。那么是不是可以表示為一個結構體呢:

typeClosurestruct{
Ffunc()()
i*int
}

事實上,Go在底層確實就是這樣表示一個閉包的。讓我們看一下匯編代碼:

funcf(iint)func()int{
returnfunc()int{
i++
returni
}
}


MOVQ$type.int+0(SB),(SP)
PCDATA$0,$16
PCDATA$1,$0
CALL,runtime.new(SB)//是不是很熟悉,這一段就是i=new(int)
...
MOVQ$type.struct{Fuintptr;A0*int}+0(SB),(SP)//這個結構體就是閉包的類型
...
CALL,runtime.new(SB)//接下來相當于new(Closure)
PCDATA$0,$-1
MOVQ8(SP),AX
NOP,
MOVQ$"".func·001+0(SB),BP
MOVQBP,(AX)//函數(shù)地址賦值給Closure的F部分
NOP,
MOVQ"".&i+16(SP),BP//將堆中new的變量i的地址賦值給Closure的值部分
MOVQBP,8(AX)
MOVQAX,"".~r1+40(FP)
ADDQ$24,SP
RET,

其中func·001是另一個函數(shù)的函數(shù)地址,也就是f返回的那個函數(shù)。

小結

  1. Go語言支持閉包
  2. Go語言能通過escape analyze識別出變量的作用域,自動將變量在堆上分配。將閉包環(huán)境變量在堆上分配是Go實現(xiàn)閉包的基礎。
  3. 返回閉包時并不是單純返回一個函數(shù),而是返回了一個結構體,記錄下函數(shù)返回地址和引用的環(huán)境中的變量地址。

tiancaiamao.gitbooks.io/go-internals/content/zh/03.6.html

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 語言
    +關注

    關注

    1

    文章

    97

    瀏覽量

    24747
  • 函數(shù)
    +關注

    關注

    3

    文章

    4405

    瀏覽量

    66798

原文標題:Golang 閉包的實現(xiàn)

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言的分支結構介紹

    1.簡單if語句 C語言中的分支結構語句中的if條件語句。 簡單if語句的基本結構如下: 代碼語言:javascript if(表達式) { 執(zhí)行代碼塊; } 其語義是:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。 注意:if()后面沒有分號,直
    發(fā)表于 11-25 07:48

    C語言的常量介紹

    、-13; 實型常量:13.33、-24.4; 字符常量:‘a’、‘M’ 字符串常量:”I love china!” 在C語言中,可以用一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先
    發(fā)表于 11-24 07:12

    一文帶你了解海凌科毫米波雷達

    什么是毫米波雷達?毫米波雷達有什么特點?毫米波雷達有什么作用?海凌科有哪些系列毫米波雷達?一文帶你了解!毫米波的定義毫米波是指頻率在30GHz至300GHz之間、波長為1~10毫米的電磁波,兼具微波
    的頭像 發(fā)表于 08-11 12:04 ?766次閱讀
    一文<b class='flag-5'>帶你</b><b class='flag-5'>了解</b>海凌科毫米波雷達

    【VisionFive 2單板計算機試用體驗】3、開源大語言模型部署

    , Gemma等開源大模型。當然,一些源的(類似chatgpt, gemini)是不支持部署的。如下圖: 在端側部署大模型,個人認為最大的好處:是可以避免因文本或圖片上傳而造成的信息泄露,因為一切文本
    發(fā)表于 07-19 15:45

    一文帶你了解電源測試系統(tǒng)的功能!

    在當今電子與電力技術飛速發(fā)展的時代,各類電子設備、電力系統(tǒng)以及新能源相關產品的研發(fā)、生產和維護過程中,電源測試系統(tǒng)扮演著至關重要的角色。本文將帶你了解源儀電子的電源測試系統(tǒng)的功能。
    的頭像 發(fā)表于 07-02 09:10 ?599次閱讀
    一文<b class='flag-5'>帶你</b><b class='flag-5'>了解</b>電源測試系統(tǒng)的功能!

    Windows環(huán)境下32位匯編語言中文資料

    電子發(fā)燒友網站提供《Windows環(huán)境下32位匯編語言中文資料.rar》資料免費下載
    發(fā)表于 06-30 15:14 ?0次下載

    深入理解C語言:C語言循環(huán)控制

    改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細介紹這些語句的作用及其應用場景,并通過示例代碼進行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發(fā)表于 04-29 18:49 ?1722次閱讀
    深入理解C<b class='flag-5'>語言</b>:C<b class='flag-5'>語言</b>循環(huán)控制

    從 Java 到 Go:面向對象的巨人與云原生的輕騎兵

    Go 語言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設計原則,強調“以工程效率為核心,用極簡規(guī)則解決復雜問題”。它與 Java 語言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?498次閱讀

    接觸器常開常是什么意思

    在電氣自動化控制系統(tǒng)中,接觸器作為一種重要的控制元件,廣泛應用于電動機啟動、停止控制,以及電力線路的切換和保護。接觸器的常開和常觸點是其核心組成部分,對于實現(xiàn)電路的邏輯控制和保護起著至關重要的作用
    的頭像 發(fā)表于 02-06 16:21 ?7367次閱讀

    Arm帶你了解2025年及未來在不同技術市場的關鍵技術方向

    Arm 對未來技術的發(fā)展方向及可能出現(xiàn)的趨勢有著廣泛而深刻的洞察。在上周的文章中,我們預測了 AI 和芯片設計方面的未來趨勢,本期將帶你深入了解 2025 年及未來在不同技術市場的關鍵技術方向
    的頭像 發(fā)表于 01-24 16:14 ?1850次閱讀

    EE-62:在C語言中訪問短字內存

    電子發(fā)燒友網站提供《EE-62:在C語言中訪問短字內存.pdf》資料免費下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:在C<b class='flag-5'>語言中</b>訪問短字內存

    EE-128:C語言中的DSP:從C調用匯編類成員函數(shù)

    電子發(fā)燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:C<b class='flag-5'>語言中</b>的DSP:從C調用匯編類成員函數(shù)

    霍爾元件常開和常怎么區(qū)分

    霍爾元件是一種基于霍爾效應的磁傳感器,它通過感應磁場的變化來輸出相應的電信號。在討論如何區(qū)分霍爾元件的常開和常之前,我們需要了解一些基本概念?;魻栐话阌蠳PN和PNP兩種輸出類型,而常開和常
    的頭像 發(fā)表于 12-18 10:08 ?1842次閱讀

    影目科技發(fā)布全球首款同傳翻譯眼鏡INMO GO2

    近日,搭載紫光展銳W517芯片平臺的INMO GO2由影目科技正式推出。作為全球首款專為商務場景設計的智能翻譯眼鏡,INMO GO2 以“快、準、穩(wěn)”三大核心優(yōu)勢,突破傳統(tǒng)翻譯產品局限,為全球商務人士帶來高效、自然、穩(wěn)定的跨語言
    的頭像 發(fā)表于 12-11 10:00 ?1930次閱讀

    深入理解C語言:循環(huán)語句的應用與優(yōu)化技巧

    能讓你的代碼更加簡潔明了,還能顯著提升程序執(zhí)行效率。本文將詳細介紹C語言中的三種常見循環(huán)結構——while循環(huán)、for循環(huán)和do...while循環(huán),帶你深入理解它
    的頭像 發(fā)表于 12-07 01:11 ?1040次閱讀
    深入理解C<b class='flag-5'>語言</b>:循環(huán)語句的應用與優(yōu)化技巧