Go unsafe包

董雷發表於2022-01-12

Sizeof函式

//Sizeof函式可以返回一個型別所佔用的記憶體大小,這個大小隻有型別有關,和型別對應的變數儲存的內容大小無關,比如bool型佔用一個位元組、int8也佔用一個位元組。
func main() {
    fmt.Println(unsafe.Sizeof(true))
    //對於整型來說,佔用的位元組數意味著這個型別儲存數字範圍的大小,比如int8佔用一個位元組,也就是8bit,
    //所以它可以儲存的大小範圍是-128~~127,也就是−2^(n-1)到2^(n-1)−1,n表示bit,int8表示8bit,int16表示16bit,其他以此類推。
    fmt.Println(unsafe.Sizeof(int8(0)))
    fmt.Println(unsafe.Sizeof(int16(10)))
    fmt.Println(unsafe.Sizeof(int32(10000000)))
    fmt.Println(unsafe.Sizeof(int64(10000000000000)))
    //對於和平臺有關的int型別,這個要看平臺是32位還是64位,會取最大的。比如我自己測試,以上輸出,會發現int和int64的大小是一樣的,因為我的是64位平臺的電腦。
    fmt.Println(unsafe.Sizeof(int(10000000000000000)))
//返回
1
1
2
4
8
8

}

Offsetof 函式

//欄位的偏移量,就是該欄位在struct結構體記憶體佈局中的起始位置(記憶體位置索引從0開始)。
//根據欄位的偏移量,我們可以定位結構體的欄位,進而可以讀寫該結構體的欄位,哪怕他們是私有的,黑客的感覺有沒有。偏移量的概念,我們會在下一小結詳細介紹。
func main() {
    type user1 struct {
        b byte
        i int32
        j int64
    }
    var u1 user1
    fmt.Println("u1.b 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.b)) + "位元組")
    fmt.Println("u1.b 的偏移量是 " + helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.b)))
    fmt.Println("u1.i 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.i)) + "位元組")
    fmt.Println("u1.i 的偏移量是 "+ helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.i)))
    fmt.Println("u1.j 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.j)) + "位元組")
    fmt.Println("u1.j 的偏移量是 "+ helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.j)))

}
//返回結果
u1.b 的大小是1位元組
u1.b 的偏移量是 0
u1.i 的大小是4位元組
u1.i 的偏移量是 4 
u1.j 的大小是8位元組
u1.j 的偏移量是 8

Alignof 函式

本作品採用《CC 協議》,轉載必須註明作者和本文連結
good good study day day up

相關文章