欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?指針、uintptr、unsafe.Pointer之間如何轉換

 更新時間:2025年07月25日 08:24:19   作者:小許cod  
本文詳細介紹了Go語言中普通指針(*T)、uintptr和unsafe.Pointer的區(qū)別與轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

普通指針(*T)

普通指針類型,用于傳遞對象地址,不能進行指針運算

	a := 10
	var b *int  //int類型指針
	b = &a
	fmt.Println("a=", a)  // a=10
	fmt.Println("b=", b)  // b=0xc000225530 輸出的是a的地址
	fmt.Println("c=", *b) // c=10  對a的地址進行取值

uintptr

uintptr是一個無符號的整型,它可以保存一個指針地址,它可以進行指針運算。想取值需要轉成unsafe.Pointer后, 需再轉到相對應的指針類型。

源代碼中的定義如下。

package builtin

//uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
//uintptr是一個能足夠容納指針位數大小的整數類型
type uintptr uintptr

unsafe.Pointer

unsafe.Pointer功能介紹

unsafe.Pointer定義如下,可以指向任意類型的int指針。不能進行指針運算,不能讀取內存存儲的值(想讀取的話需要轉成相對應類型的指針)。
它是橋梁,讓任意類型的指針實現相互轉換, 也可以轉換成uintptr 進行指針運算。

type Pointer *ArbitraryType

type ArbitraryType int

unsafe.Pointer作為橋梁實現相互轉換

unsafe.Pointer在unsafe包中還有以下幾個函數在我們計算可能會用到

==unsafe包的幾個函數==

//返回一個變量占用的內存字節(jié)數
func Sizeof(x ArbitraryType) uintptr

//返回結構體某個字段的地址相對于此結構體起始地址的偏移量
func Offsetof(x ArbitraryType) uintptr

//返回對齊系數
func Alignof(x ArbitraryType) uintptr

指針和unsafe.Pointer的轉換

舉些栗子:

	a := int64(100)
	var ptr *int
	ptr = (*int)(unsafe.Pointer(&a))
	fmt.Printf("%d\n", *ptr) 
	//輸出100 如果是int32輸出一個很大值
	

這是個將int64轉換為int的場景,如果是int32的話轉換起來會出問題,因為存在轉換后的類型大于轉換前的類型。
如果是結構體的話,我們可以用到unsafe.Offsetof函數來計算

    type People struct {
	    age    int32
	    height int64
    }
    var p = &People
	height := unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Offsetof(p.height))
	*((*int)(height)) = 100 //將height的值改為100
	//uintptr(unsafe.Pointer(p)) 獲取了 w 的指針起始值
    //unsafe.Offsetof(w.p) 獲取 b 變量的偏移量

uintptr和unsafe.Pointer的轉換

同樣舉個栗子,結合上面的People結構體的操作,對unsafe.Pointer和uintptr的轉換做一個詳細的說明,對加深理解非常清晰明了。

    var p = &People
	height := unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Offsetof(p.height))
	*((*int)(height)) = 100 //將height的值改為100

上面的代碼可以理解為以下步驟:

  1. 要想修改People結構體的height的值,首先unsafe.Pointer(p),轉換為uintptr
  2. 通過unsafe.Offsetof獲取height的偏移量,兩者都是uintptr,可進行運算得到height的地址
  3. unsafe.Pointer將height的地址轉為uintptr
  4. 先轉為*int指針,然后獲得height的值并賦值100

總結

指針、uintptr、unsafe.Pointer之間的轉換有點繞,相信看完這個會對這個有一個非常清晰的了解。大家可以動手試試

到此這篇關于Go 指針、uintptr、unsafe.Pointer之間如何轉換的文章就介紹到這了,更多相關Go 指針 uintptr unsafe.Pointer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • GO語言的map類型實例詳解

    GO語言的map類型實例詳解

    這篇文章主要介紹了GO語言的map類型實例詳解,包括對map的創(chuàng)建,賦值,排序,刪除,等操作需要的朋友可以參考下
    2022-12-12
  • 詳解Golang中string的實現原理與高效使用

    詳解Golang中string的實現原理與高效使用

    在Go語言中,無論是字符串常量、字符串變量還是代碼中出現的字符串字面量,它們的類型都被統(tǒng)一設置為string,下面就跟隨小編一起來了解一下Golang中string的實現原理與高效使用吧
    2024-01-01
  • Golang通道阻塞情況與通道無阻塞實現小結

    Golang通道阻塞情況與通道無阻塞實現小結

    本文主要介紹了Golang通道阻塞情況與通道無阻塞實現小結,詳細解析了通道的類型、操作方法以及垃圾回收機制,從基礎概念到高級應用,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • go標準庫net/http服務端的實現示例

    go標準庫net/http服務端的實現示例

    go的http標準庫非常強大,本文主要介紹了go標準庫net/http服務端,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • GO項目部署Linux服務器的實現示例

    GO項目部署Linux服務器的實現示例

    本文主要介紹了GO項目部署Linux服務器的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Golang的引用類型和指針的使用與區(qū)別

    Golang的引用類型和指針的使用與區(qū)別

    本文詳細介紹了Golang中的引用類型和指針的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • go 代碼格式化和風格開發(fā)者指南

    go 代碼格式化和風格開發(fā)者指南

    這篇文章主要為大家介紹了go 代碼格式化和風格開發(fā)者指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 重學Go語言之數組的具體使用詳解

    重學Go語言之數組的具體使用詳解

    Go的數組是一種復合數據類型,在平時開發(fā)中并不常用,更常用的是切片(slice),可以把切片看作是能動態(tài)擴容的數組,切片的底層數據結構就是數組,所以數組雖不常用,但仍然有必要掌握
    2023-02-02
  • GO的基礎知識掃盲注意事項

    GO的基礎知識掃盲注意事項

    這篇文章主要介紹了GO的基礎知識注意事項,本文是GO語言小白的掃盲文,主要講解了go語言的基本知識,GO程序目錄結構,GO程序包的導入與別名運用,GO內置關鍵字,GO注釋方法需要的朋友可以參考下
    2022-12-12
  • Kafka安裝部署+go整合過程

    Kafka安裝部署+go整合過程

    go語言是一種快速、分布式、并發(fā)編程的語言,它天生適合于處理高并發(fā)場景下的消息傳遞和處理,在本文中,我們將介紹Kafka安裝部署+go整合過程,感興趣的朋友一起看看吧
    2024-08-08

最新評論