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

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang 反射獲取閉包函數(shù)指針

golang 反射獲取閉包函數(shù)指針

Go
繁華開滿天機(jī) 2021-12-27 15:17:11
請檢查代碼package mainimport (    "fmt"    "reflect")func main() {    factory := func  (name string) func(){        return func (){            fmt.Println(name)        }    }    f1 := factory("f1")    f2 := factory("f2")    pf1 := reflect.ValueOf(f1)    pf2 := reflect.ValueOf(f2)    fmt.Println(pf1.Pointer(), pf2.Pointer())    fmt.Println(pf1.Pointer() == pf2.Pointer())    f1()    f2()}結(jié)果:4199328 4199328truef1f2為什么到了閉包函數(shù)的同一個地址!或者如何獲取唯一地址!
查看完整描述

3 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個贊

函數(shù)指針表示函數(shù)的代碼。而函數(shù)字面量創(chuàng)建的匿名函數(shù)的代碼只會在內(nèi)存中存儲一次,無論返回匿名函數(shù)值的代碼運(yùn)行多少次。這意味著所有函數(shù)值(或更準(zhǔn)確地說是函數(shù)指針)都將相同。


所以你無法區(qū)分存儲在f1and 中的值f2:它們表示在調(diào)用它們時(shí)要執(zhí)行的相同代碼塊。


存儲在factory變量中的函數(shù)值返回的函數(shù)值是一個閉包。只要它可以訪問,它所引用的環(huán)境(局部變量和函數(shù)參數(shù))就會一直存在。在您的情況下,這意味著由于函數(shù)值 inf1和f2引用name封閉匿名函數(shù)的參數(shù),只要函數(shù)值( inf1和f2)可訪問,它們(來自多個調(diào)用的“它們”)將被保留。這是唯一使它們“不同”或獨(dú)特的東西,但這是從“外部”看不到的。


你會繼續(xù)打印name閉包中的地址嗎,你會看到它們是閉包的多個值的不同變量,但是如果再次調(diào)用相同的閉包(函數(shù)值),它是相同的。首先修改閉包以打印以下地址:name


factory := func(name string) func() {

    return func() {

        fmt.Println(name, &name)

    }

}

并調(diào)用f1和f2多次:


f1()

f2()

f1()

f2()

輸出:


f1 0x1040a120

f2 0x1040a130

f1 0x1040a120

f2 0x1040a130

如您所見,如果再次調(diào)用相同的閉包,name則保留name參數(shù)并再次使用相同的參數(shù)。


查看完整回答
反對 回復(fù) 2021-12-27
?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個贊

https://golang.org/pkg/reflect/#Value.Pointer

如果 v 的 Kind 是 Func,則返回的指針是底層代碼指針,但不一定足以唯一標(biāo)識單個函數(shù)。唯一的保證是當(dāng)且僅當(dāng) v 是一個 nil func 值時(shí)結(jié)果為零。


查看完整回答
反對 回復(fù) 2021-12-27
?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個贊

實(shí)際上,*func()在 Golang 中輸入相當(dāng)于void (*)(void)在 C 中輸入。(我知道這一點(diǎn)是因?yàn)槲医?jīng)常使用 cgo。)

并且func()在圍棋被定義為文字,這意味著它的類似的東西代表機(jī)器代碼,而不是一個函數(shù)指針字節(jié)的BLOB。

請注意,Golang中一切都是按傳遞的,甚至 Go 中的函數(shù)也不例外。

var f1 func() = ...
reflect.ValueOf(f1)

當(dāng)您這樣做時(shí),我認(rèn)為您正在嘗試獲取名為 的代碼塊的前 8 個字節(jié)f1,這不是該函數(shù)的地址。

在 Go 中,您永遠(yuǎn)無法獲得 a 的地址func()

因?yàn)?afunc()文字,文字沒有地址。文字不在內(nèi)存中的任何地方。所以你不能得到一個地址。


查看完整回答
反對 回復(fù) 2021-12-27
  • 3 回答
  • 0 關(guān)注
  • 323 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號