1 回答

TA貢獻1765條經驗 獲得超5個贊
您正確地轉換了指針,但隨后取消引用它,這會生成一個副本。然后,您繼續獲取副本的地址,轉換該指針,然后再次取消引用它(這會生成另一個副本)。修改任何副本不會對其他副本產生任何影響。
因此,不要取消引用指針(最終我們只是修改位于同一內存位置的指向值):
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
- 1 回答
- 0 關注
- 141 瀏覽
添加回答
舉報