久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

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

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

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

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

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

      golang的指針轉(zhuǎn)換

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

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

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

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

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

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

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

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

      但 Pointer 不支持運算,如果要在內(nèi)存地址上進行加減運算,需要將其轉(zhuǎn)為 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)指針轉(zhuǎn)換

      上述代碼中:

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

        通過 (**[10]int)(unsafe.Pointer(&s)) 將其轉(zhuǎn)為 **[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)存轉(zhuǎn)為 int 指針

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

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

      總之:

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

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

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號