Golang標準庫學習 unsafe

2021-09-12 16:00:43 字數 2696 閱讀 7489

import "unsafe"

unsafe包提供了一些跳過go語言型別安全限制的操作。能夠訪問底層記憶體,使用unsafe函式可以提高訪問物件的速度,但是這不是go語言推薦使用的,容易出現莫名其妙的問題,不利於擴充套件與維護。

type arbitrarytype int

type pointer *arbitrarytype

func sizeof(x arbitrarytype) uintptr

func offsetof(x arbitrarytype) uintptr

func alignof(x arbitrarytype) uintptr

unsafe包的用處有很多,可以通過unsafe對陣列、結構體等進行操作,當然這是在某些情況下的特殊操作。

type arbitrarytype int
arbitrarytype 是int的乙個別名,但是代表乙個任意go表示式型別。

type pointer *arbitrarytype
pointer型別用於表示任意型別的指標。有4個特殊的只能用於pointer型別的操作:

1. 任意型別的指標可以轉換為乙個pointer型別值

2. 乙個pointer型別值可以轉換為任意型別的指標

3.乙個uintptr型別值可以轉換為乙個pointer型別值

4. 乙個pointer型別值可以轉換為乙個uintptr型別值

unsafe.pointer 是橋梁,可以讓任意型別的指標實現相互轉換,也可以將任意型別的指標轉換為 uintptr 進行指標運算。pointer型別允許程式繞過型別系統讀寫任意記憶體。使用它時必須謹慎。

這裡說一下golang中的三種指標:

*type : 普通指標,用於傳遞物件位址,不能進行指標運算。

unsafe.pointerl : 通用指標型別,用於轉換不同型別指標,不能進行指標運算。

uintptr : 用於指標運算,無法持有物件,該型別目標會被**。

func sizeof(x arbitrarytype) uintptr
sizeof返回型別x本身資料所占用的位元組數。返回值是「頂層」的資料占有的位元組數。例如,若x是乙個切片,它會返回該切片描述符的大小,而非該切片底層引用的記憶體的大小。

func offsetof(x arbitrarytype) uintptr
offsetof返回型別x所代表的結構體字段在結構體中的偏移量,它必須為結構體型別的字段的形式。換句話說,它返回該結構起始處與該字段起始處之間的位元組數。

func alignof(x arbitrarytype) uintptr
alignof返回型別x的對齊方式(即型別x在記憶體中占用的位元組數);若是結構體型別的字段的形式,它會返回欄位f在該結構體中的對齊方式。 

示例

其實看unsafe包是因為在看golang記憶體對齊的事,所以這裡用記憶體對齊示範

從結果可以看出unsafe.sizeof()得到的uintptr的值,unsafe.alignof()得到的是對齊方式,unsafe.offsetof()得到偏移值。

golang標準庫 time包

時間型別,包含了秒和納秒以及location type month int 月份.定義了十二個月的常量 type weekday int 周,定義了一周的七天 type duration int64 持續時間.定義了以下持續時間型別.多用於時間的加減 需要傳入duration做為引數的時候.可以直接...

golang中的標準庫http

go語言內建的net http包十分的優秀,提供了http客戶端和服務端的實現。基本的http https請求 get head post和postform函式發出http https請求。url.values,id 程式在使用完response後必須關閉回覆的主體。使用net http包編寫乙個簡...

golang中的標準庫strconv

這一組函式是我們平時程式設計中用的最多的。atoi 函式用於將字串型別的整數轉換為int型別,函式簽名如下。func atoi s string i int,err error 如果傳入的字串引數無法轉換為int型別,就會返回錯誤。func main 結論 atoi 如果轉換成功結果就是正常的數值,...