golang 中的 unsafe.Pointer

golang的指針類型是不允許直接對指針類型進行運算,保留指針的特點,規避掉由於指針操作不當而引發的各種奇怪問題。但是有些時候確實需要使用到指針運算的時候,就需要使用到unsafe包了。如果不使用unsafe包的時候,是不能進行指針運算的。

golang 中的 unsafe.Pointer

uintptr和unsafe.Pointer的區別就是:

unsafe.Pointer只是單純的通用指針類型,用於轉換不同類型指針,它不可以參與指針運算;

uintptr是go的內置類型,用於指針運算,其底層基於int類型。uintptr不是指針,GC會回收uintptr類型的對象。

unsafe.Sizeof函數返回的就是uintptr類型的值,用來得到一個值應該佔用多少個字節空間。

type W struct {

a byte

b int32

c int64

}

var w *W

fmt.Println(unsafe.Sizeof(w))

結果:16

unsafe.Pointer:通用指針類型,用於轉換不同類型的指針,不能進行指針運算。用於不同指針類型之間進行強制類型轉換,必須將其轉化成 uintptr 類型才能進行指針的運算。

import (

"fmt"

"unsafe"

)

func main() {

u := uint32(32)

i := int32(1)

fmt.Println(&u, &i)

p := &i

p = (*int32)(&u)

p = (*int32)(unsafe.Pointer(&u))

fmt.Println(p)

}

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: