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

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

從指針接口獲取結(jié)構(gòu)的大小

從指針接口獲取結(jié)構(gòu)的大小

Go
12345678_0001 2023-06-19 15:30:39
我正在嘗試從接口中一般獲取任何結(jié)構(gòu)的大小。這適用于按值傳遞的對(duì)象,但我不知道如何在使用接口傳遞引用時(shí)獲取對(duì)象的大小。這是一個(gè)說明我遇到的問題的示例: https://play.golang.org/p/QXXZm-j7_hZpackage mainimport (    "fmt"    "reflect"    "unsafe")type T struct {    c [50]byte}func main() {    fmt.Println("Hello, playground")    var t T    s := unsafe.Sizeof(t)    fmt.Println("expected size", s)    getSize(t, &t)}func getSize(valueObject interface{}, referenceObject interface{}) {    vs := []uintptr{        unsafe.Sizeof(valueObject),        unsafe.Sizeof(reflect.ValueOf(valueObject)),        reflect.TypeOf(valueObject).Size(), // THIS WORKS FOR VALUE        reflect.TypeOf(reflect.ValueOf(valueObject)).Size(),        0, //reflect.TypeOf(reflect.ValueOf(valueObject).Elem()).Size(), //EXCEPTION ACCESSING ELEM WITH VALUE        0, //reflect.TypeOf(reflect.ValueOf(valueObject).Elem()).Size(), //EXCEPTION ACCESSING ELEM WITH VALUE        0, //unsafe.Sizeof(reflect.ValueOf(valueObject).Elem()), //EXCEPTION ACCESSING ELEM WITH VALUE        0, //unsafe.Sizeof(reflect.TypeOf(reflect.ValueOf(valueObject).Elem())), //EXCEPTION ACCESSING ELEM WITH VALUE    }    fmt.Println("valueObject size", vs)    rs := []uintptr{        unsafe.Sizeof(referenceObject),        unsafe.Sizeof(reflect.ValueOf(referenceObject)),        reflect.TypeOf(referenceObject).Size(),        reflect.TypeOf(reflect.ValueOf(referenceObject)).Size(),        reflect.TypeOf(reflect.ValueOf(referenceObject).Elem()).Size(),        reflect.TypeOf(reflect.ValueOf(referenceObject).Elem()).Size(),        unsafe.Sizeof(reflect.ValueOf(referenceObject).Elem()),        unsafe.Sizeof(reflect.TypeOf(reflect.ValueOf(referenceObject).Elem())),    }    fmt.Println("referenceObject size", rs)}這是輸出:expected size 50valueObject size [8 12 50 12 0 0 0 0]referenceObject size [8 12 4 12 12 12 12 8]正如您所看到的,當(dāng)我使用 傳遞值時(shí),我可以獲得對(duì)象的大小reflect.TypeOf(valueObject).Size(),但是當(dāng)我傳遞引用時(shí),沒有任何東西給我正確的大小。
查看完整描述

1 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

go 中沒有“引用”類型,指針和其他任何東西一樣都是一個(gè)值,你當(dāng)然可以得到指針本身的大小。您還混淆了您想要的大小的reflect.Value、 theinterface{}和實(shí)際值。導(dǎo)致這種混淆的原因是包unsafe是特殊的,它不接受接口值,而是可以直接接受任何值,這由編譯器正確處理。


您可以通過單獨(dú)的調(diào)用處理指針和結(jié)構(gòu),或者檢查您是否有指針并調(diào)用Elem():


// struct

reflect.ValueOf(i).Type().Size()

// pointer

reflect.ValueOf(i).Elem().Type().Size()

但是,由于可選地取消引用指針是很常見的,您可以使用reflect.Indirect一次處理這兩種類型:


reflect.Indirect(reflect.ValueOf(i)).Type().Size()

https://play.golang.org/p/og-uMDXCmEr


作為參考,一些嘗試實(shí)際采取的描述:


// size of the interface value

unsafe.Sizeof(valueObject)


// size of reflect.Value

unsafe.Sizeof(reflect.ValueOf(valueObject))


// size of the reflect.Value type 

reflect.TypeOf(reflect.ValueOf(valueObject)).Size()


// size of the interface value

unsafe.Sizeof(referenceObject)


// size of the reflect.Value

unsafe.Sizeof(reflect.ValueOf(referenceObject))


// size of the pointer value

reflect.TypeOf(referenceObject).Size()


// size of the reflect.Value type

reflect.TypeOf(reflect.ValueOf(referenceObject)).Size(),


// size of the of reflect.Value type again

reflect.TypeOf(reflect.ValueOf(referenceObject).Elem()).Size()


// size of the reflect.Value

unsafe.Sizeof(reflect.ValueOf(referenceObject).Elem()),


// size of the reflect.Type interface value

unsafe.Sizeof(reflect.TypeOf(reflect.ValueOf(referenceObject).Elem())),


查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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