真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang如何實現(xiàn)指針轉換

本篇內(nèi)容介紹了“golang如何實現(xiàn)指針轉換”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

我們提供的服務有:成都做網(wǎng)站、成都網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、河南ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的河南網(wǎng)站制作公司

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

在golang中,可以利用unsafe包來實現(xiàn)指針轉換。

golang的指針轉換

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

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

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

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

  • uintptr可以轉換為Pointer。

  • Pointer可以轉換為uintptr。

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

golang如何實現(xiàn)指針轉換

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

下面我們嘗試讀取切片地址,并通過內(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

golang如何實現(xiàn)指針轉換

上述代碼中:

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

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

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

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

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

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

總之:

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

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

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

“golang如何實現(xiàn)指針轉換”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


分享名稱:golang如何實現(xiàn)指針轉換
本文URL:http://weahome.cn/article/pdjcoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部