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)
}
更多内容请关注每日编程,每天进步一点。