站長資訊網
最全最豐富的資訊網站

golang怎么實現指針轉換

在golang中,可以利用unsafe包來實現指針轉換,實現內存地址在不同指針類型間的轉換,進而更靈活地操作內存。例如unsafe包下的Pointer()函數可以將任意變量的地址轉換成Pointer類型,也可以將Pointer類型轉換成任意的指針類型,Pointer類型是不同指針類型之間互轉的中間類型。

golang怎么實現指針轉換

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

在golang中,可以利用unsafe包來實現指針轉換。

golang的指針轉換

Golang 提供了 unsafe 包,讓我們能夠直接操作指定內存地址的內存。

unsafe包下,有定義type Pointer *ArbitraryType(任意類型指針),可繞過GO的類型限制,type ArbitraryType int

  • 任何類型的指針值都可以轉換為Pointer。

  • Pointer可以轉換為任何類型的指針值。

  • uintptr可以轉換為Pointer。

  • Pointer可以轉換為uintptr。

通過 unsafe.Pointer() 函數,我們能夠獲取變量的內存地址表示,本質上這是個整數。可以將任意變量的地址轉換成 Pointer 類型,也可以將 Pointer 類型轉換成任意的指針類型,它是不同指針類型之間互轉的中間類型。

golang怎么實現指針轉換

但 Pointer 不支持運算,如果要在內存地址上進行加減運算,需要將其轉為 uintptr 類型。

下面我們嘗試讀取切片地址,并通過內存操作遍歷其內容:

package main  import "fmt" import "unsafe"  func main() { 	// head = {address, 10, 10} 	// body = [1,2,3,4,5,6,7,8,9,10] 	var s = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 	var address = (**[10]int)(unsafe.Pointer(&s)) 	var len = (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8))) 	var cap = (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(16))) 	fmt.Println(address, *len, *cap) 	var body = **address 	for i := 0; i < 10; i++ { 		fmt.Printf("%d ", body[i]) 	} } ---------- 0xc000004460 10 10 1 2 3 4 5 6 7 8 9 10
登錄后復制

golang怎么實現指針轉換

上述代碼中:

  • unsafe.Pointer(&s) 獲取切片 s 底層表示的第一個位置的內存地址,也即底層數組的地址存放地址,

    通過 (**[10]int)(unsafe.Pointer(&s)) 將其轉為 **[10]int 類型指針,又通過 **addrss 還原為數組;

  • unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8)) 通過地址運算,獲得 length 的存放地址,

    進而通過 (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8))) 將 length 內存轉為 int 指針

    最后通過 *len 獲取切片長度;

    對于 cap 的操作與 len 類似,不再贅述;

總之:

通過 unsafe,我們能夠實現內存地址在不同指針類型間的轉換,進而更靈活地操作內存;

本實驗也進一步驗證了切片的底層存儲結構;

unsafe 在不是必須的條件下應該少使用,直接操作內存畢竟是風險較大的;

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国语自产精品视频在线看| 亚洲精品成人久久| 国产精品JIZZ在线观看老狼| 亚洲日韩涩涩成人午夜私人影院| 国产精品成人免费视频网站京东| 中文字幕日韩精品麻豆系列| 久久久国产乱子伦精品| 久久99国产精品久久99果冻传媒| 久久久WWW免费人成精品| 香蕉视频在线精品| 亚洲日韩国产AV无码无码精品| 国产精品一区二区在线观看| 精品久久久久久无码人妻| 四虎国产精品免费久久| 98视频精品全部国产| 国产成人精品日本亚洲网址| 亚洲精品无码久久毛片波多野吉衣| 日韩精品极品视频在线观看免费| 国产suv精品一区二区33| 国产精品偷伦视频观看免费| 国产午夜精品久久久久免费视| 99re这里只有精品6| 精品无码国产污污污免费网站国产| 香蕉99久久国产综合精品宅男自 | 亚洲宅男精品一区在线观看| 精品人妻va出轨中文字幕| 久久久无码人妻精品无码| 99久久99久久精品| 91精品啪在线观看国产18| 亚洲国产成人91精品| 国产高清国产精品国产专区| 国产精品久久久久鬼色| 国产精品入口在线看麻豆| 2020久久精品亚洲热综合一本| 国产精品bbwbbwbbw| 91精品免费在线观看| 国产精品大尺度尺度视频| 亚洲色偷精品一区二区三区| 91麻豆国产精品91久久久| 中文字幕无码精品亚洲资源网久久| 2020精品自拍视频曝光|