1:求各类型的长度
1.
var x string
fmt.Println(unsafe.Sizeof(x))
//输出16.因为string的底层结构为
type stringStruct struct {
str unsafe.Pointer
len int
}
2.
var s []int
fmt.Println(unsafe.Sizeof(s))
//输出24.因为切片的底层结构为{*ptr,len ,cap}
2:通过偏移取值
Pointer类型用于表示任意类型的指针。有4个特殊的只能用于Pointer类型的操作:
1) 任意类型的指针可以转换为一个Pointer类型值 2) 一个Pointer类型值可以转换为任意类型的指针 3) 一个uintptr类型值可以转换为一个Pointer类型值 4) 一个Pointer类型值可以转换为一个uintptr类型值
type T struct {
x int
y int
z string
}
t:= &T{1,2,"abc"}
ptr:=unsafe.Pointer(t)
fmt.Println("x=",*((*int)(ptr)))
fmt.Println("y=",*(*int)(unsafe.Pointer(uintptr(ptr)+unsafe.Offsetof(t.y))))
fmt.Println("z=",*(*string)(unsafe.Pointer(uintptr(ptr)+unsafe.Offsetof(t.z))))