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

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

將結(jié)構(gòu)轉(zhuǎn)換為字節(jié)片的特定地址

將結(jié)構(gòu)轉(zhuǎn)換為字節(jié)片的特定地址

Go
小唯快跑啊 2023-08-21 14:47:35
為了解析一個大文件而不必為每個結(jié)構(gòu)復(fù)制字節(jié),我想將結(jié)構(gòu)直接轉(zhuǎn)換為字節(jié)片中的地址。這僅僅是出于性能原因。我知道我可以使用 binary.Read() 從字節(jié)切片創(chuàng)建結(jié)構(gòu),但據(jù)我了解,這會復(fù)制字節(jié),這是一件代價高昂的事情;因此我想避免在這個用例中使用這種方法。我似乎確實已經(jīng)轉(zhuǎn)換了該結(jié)構(gòu),因為我確實在結(jié)構(gòu)中獲取了我期望的數(shù)據(jù)。但是,當(dāng)我更改結(jié)構(gòu)中的值時,它們不會更改結(jié)構(gòu)地址應(yīng)指向的字節(jié)片?對我來說重要的是文件(字節(jié)切片)反映了我的結(jié)構(gòu)中數(shù)據(jù)的變化。如何讓結(jié)構(gòu)體在文件中的相應(yīng)地址上工作?這是我到目前為止所做的演示:type T struct {    A uint8}func main() {    data := []byte{0xA, 0xB, 0xC}    // Cast bytes to struct    pointer := *(*uint8)(unsafe.Pointer(&data[0]))    fmt.Printf("ptr:\t0x%x\n", pointer)    t2 := *(*T)(unsafe.Pointer(&pointer))    fmt.Printf("T:\t0x%x\n\n", t2.A)    // byte casting to struct ends here    // test    t2.A = 0x0 // I expect this to change for data as well but it does not.    fmt.Println("AFTER CHANGE OF t2.A")    fmt.Printf("data[0]:0x%x\n", data[0])    fmt.Printf("ptr:\t0x%x\n\n", pointer)    fmt.Println("WHY ARE THESE ON DIFFERENT ADDRESSES?")    fmt.Printf("DataAddr: 0x%p\n", data)    fmt.Printf("PtrAddr: 0x%p\n", &pointer)    fmt.Printf("T2Addr: 0x%p\n", &t2)}這打印出:ptr:    0xaT:      0xaAFTER CHANGE OF t2.A - the original data slice has not been altered.data[0]:0xaptr:    0xaADDRESSESDataAddr: 0x0xc000094010PtrAddr: 0x0xc000094013T2Addr: 0x0xc000094030
查看完整描述

1 回答

?
POPMUISE

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

您正確地轉(zhuǎn)換了指針,但隨后取消引用它,這會生成一個副本。然后,您繼續(xù)獲取副本的地址,轉(zhuǎn)換該指針,然后再次取消引用它(這會生成另一個副本)。修改任何副本不會對其他副本產(chǎn)生任何影響。


因此,不要取消引用指針(最終我們只是修改位于同一內(nèi)存位置的指向值):


data := []byte{0xA, 0xB, 0xC}


// Cast bytes to struct

pointer := (*uint8)(unsafe.Pointer(&data[0]))

fmt.Printf("ptr:\t0x%x\n", *pointer)


t2 := (*T)(unsafe.Pointer(pointer))

fmt.Printf("T:\t0x%x\n\n", t2.A)

// byte casting to struct ends here


// test

t2.A = 0x0 // This will also change data


fmt.Println("AFTER CHANGE OF t2.A")

fmt.Printf("data[0]:0x%x\n", data[0])

fmt.Printf("ptr:\t0x%x\n\n", *pointer)


fmt.Println("ADDRESSES ARE ALL THE SAME:")

fmt.Printf("DataAddr: 0x%p\n", &data[0])

fmt.Printf("PtrAddr: 0x%p\n", pointer)

fmt.Printf("T2Addr: 0x%p\n", t2)

輸出(在Go Playground上嘗試):


ptr:    0xa

T:  0xa


AFTER CHANGE OF t2.A

data[0]:0x0

ptr:    0x0


ADDRESSES ARE ALL THE SAME:

DataAddr: 0x0x40e020

PtrAddr: 0x0x40e020

T2Addr: 0x0x40e020


查看完整回答
反對 回復(fù) 2023-08-21
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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