golang的指針類型是不允許直接對指針類型進行運算,保留指針的特點,規避掉由於指針操作不當而引發的各種奇怪問題。但是有些時候確實需要使用到指針運算的時候,就需要使用到unsafe包了。如果不使用unsafe包的時候,是不能進行指針運算的。
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)
}
更多內容請關注每日編程,每天進步一點。
閱讀更多 每日編程 的文章