unsafe包的使用

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))))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章