站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        golang怎么實(shí)現(xiàn)指針轉(zhuǎn)換

        在golang中,可以利用unsafe包來(lái)實(shí)現(xiàn)指針轉(zhuǎn)換,實(shí)現(xiàn)內(nèi)存地址在不同指針類(lèi)型間的轉(zhuǎn)換,進(jìn)而更靈活地操作內(nèi)存。例如unsafe包下的Pointer()函數(shù)可以將任意變量的地址轉(zhuǎn)換成Pointer類(lèi)型,也可以將Pointer類(lèi)型轉(zhuǎn)換成任意的指針類(lèi)型,Pointer類(lèi)型是不同指針類(lèi)型之間互轉(zhuǎn)的中間類(lèi)型。

        golang怎么實(shí)現(xiàn)指針轉(zhuǎn)換

        本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

        在golang中,可以利用unsafe包來(lái)實(shí)現(xiàn)指針轉(zhuǎn)換。

        golang的指針轉(zhuǎn)換

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

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

        • 任何類(lèi)型的指針值都可以轉(zhuǎn)換為Pointer。

        • Pointer可以轉(zhuǎn)換為任何類(lèi)型的指針值。

        • uintptr可以轉(zhuǎn)換為Pointer。

        • Pointer可以轉(zhuǎn)換為uintptr。

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

        golang怎么實(shí)現(xiàn)指針轉(zhuǎn)換

        但 Pointer 不支持運(yùn)算,如果要在內(nèi)存地址上進(jìn)行加減運(yùn)算,需要將其轉(zhuǎn)為 uintptr 類(lèi)型。

        下面我們嘗試讀取切片地址,并通過(guò)內(nèi)存操作遍歷其內(nèi)容:

        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
        登錄后復(fù)制

        golang怎么實(shí)現(xiàn)指針轉(zhuǎn)換

        上述代碼中:

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

          通過(guò) (**[10]int)(unsafe.Pointer(&s)) 將其轉(zhuǎn)為 **[10]int 類(lèi)型指針,又通過(guò) **addrss 還原為數(shù)組;

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

          進(jìn)而通過(guò) (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8))) 將 length 內(nèi)存轉(zhuǎn)為 int 指針

          最后通過(guò) *len 獲取切片長(zhǎng)度;

          對(duì)于 cap 的操作與 len 類(lèi)似,不再贅述;

        總之:

        通過(guò) unsafe,我們能夠?qū)崿F(xiàn)內(nèi)存地址在不同指針類(lèi)型間的轉(zhuǎn)換,進(jìn)而更靈活地操作內(nèi)存;

        本實(shí)驗(yàn)也進(jìn)一步驗(yàn)證了切片的底層存儲(chǔ)結(jié)構(gòu);

        unsafe 在不是必須的條件下應(yīng)該少使用,直接操作內(nèi)存畢竟是風(fēng)險(xiǎn)較大的;

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 日韩欧美一区二区三区中文精品 | 亚洲国产精品综合久久网络| 国产精品久久久久国产A级| 久久精品国产亚洲精品| 久久精品国产一区二区三区日韩| 无码国内精品人妻少妇| 日本精品久久久久影院日本 | 国产精品视频一区二区噜噜| 全国精品一区二区在线观看| 亚洲精品国产成人99久久| 精品国际久久久久999波多野| 亚洲国产成人久久精品99| 精品第一国产综合精品蜜芽| 一区二区三区精品| 国产91精品在线| 99热门精品一区二区三区无码| 欧美精品一区二区蜜臀亚洲| 欧美精品福利视频| 好属妞这里只有精品久久| 精品无码人妻一区二区三区| 免费人妻精品一区二区三区| 欧美+亚洲+精品+三区| 99在线精品一区二区三区| 久久精品亚洲精品国产色婷| 合区精品久久久中文字幕一区| 91精品国产综合久久四虎久久无码一级| 日本内射精品一区二区视频| 久久久久亚洲精品无码网址| 91国内揄拍国内精品对白不卡| 国产国拍亚洲精品mv在线观看 | 亚洲精品在线观看视频| 国产精品无码无在线观看| 中文字幕亚洲精品无码| 久久久无码精品午夜| 国产精品99久久久久久董美香| 黑人精品videos亚洲人| 99热精品在线| 国产精品日韩欧美一区二区三区| 人妻熟妇乱又伦精品视频| 亚洲中文字幕久久精品无码喷水 | 亚洲国产精品13p|