婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang利用unsafe操作未導出變量-Pointer使用詳解

golang利用unsafe操作未導出變量-Pointer使用詳解

熱門標簽:濱州自動電銷機器人排名 阿里云ai電話機器人 浙江高頻外呼系統多少錢一個月 釘釘有地圖標注功能嗎 建造者2地圖標注 惠州電銷防封電話卡 汕頭小型外呼系統 鄭州亮點科技用的什么外呼系統 黃岡人工智能電銷機器人哪個好

前言

unsafe.Pointer其實就是類似C的void *,在golang中是用于各種指針相互轉換的橋梁。uintptr是golang的內置類型,是能存儲指針的整型,uintptr的底層類型是int,它和unsafe.Pointer可相互轉換。uintptr和unsafe.Pointer的區別就是:unsafe.Pointer只是單純的通用指針類型,用于轉換不同類型指針,它不可以參與指針運算;而uintptr是用于指針運算的,GC 不把 uintptr 當指針,也就是說 uintptr 無法持有對象,uintptr類型的目標會被回收。golang的unsafe包很強大,基本上很少會去用它。它可以像C一樣去操作內存,但由于golang不支持直接進行指針運算,所以用起來稍顯麻煩。

切入正題。利用unsafe包,可操作私有變量(在golang中稱為“未導出變量”,變量名以小寫字母開始),下面是具體例子。

在$GOPATH/src下建立poit包,并在poit下建立子包p,目錄結構如下:

$GOPATH/src

----poit

--------p

------------v.go

--------main.go

以下是v.go的代碼:

package p

import (
 "fmt"
)

type V struct {
 i int32
 j int64
}

func (this V) PutI() {
 fmt.Printf("i=%d\n", this.i)
}

func (this V) PutJ() {
 fmt.Printf("j=%d\n", this.j)
}

意圖很明顯,我是想通過unsafe包來實現對V的成員i和j賦值,然后通過PutI()和PutJ()來打印觀察輸出結果。

以下是main.go源代碼:

package main

import (
 "poit/p"
 "unsafe"
)

func main() {
 var v *p.V = new(p.V)
 var i *int32 = (*int32)(unsafe.Pointer(v))
 *i = int32(98)
 var j *int64 = (*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + uintptr(unsafe.Sizeof(int32(0)))))
 *j = int64(763)
 v.PutI()
 v.PutJ()
}

當然會有些限制,比如需要知道結構體V的成員布局,要修改的成員大小以及成員的偏移量。我們的核心思想就是:結構體的成員在內存中的分配是一段連續的內存,結構體中第一個成員的地址就是這個結構體的地址,您也可以認為是相對于這個結構體偏移了0。相同的,這個結構體中的任一成員都可以相對于這個結構體的偏移來計算出它在內存中的絕對地址。

具體來講解下main方法的實現:

var v *p.V = new(p.V)

new是golang的內置方法,用來分配一段內存(會按類型的零值來清零),并返回一個指針。所以v就是類型為p.V的一個指針。

var i *int32 = (*int32)(unsafe.Pointer(v))

將指針v轉成通用指針,再轉成int32指針。這里就看到了unsafe.Pointer的作用了,您不能直接將v轉成int32類型的指針,那樣將會panic。剛才說了v的地址其實就是它的第一個成員的地址,所以這個i就很顯然指向了v的成員i,通過給i賦值就相當于給v.i賦值了,但是別忘了i只是個指針,要賦值得解引用。

*i = int32(98)

現在已經成功的改變了v的私有成員i的值,好開心_

但是對于v.j來說,怎么來得到它在內存中的地址呢?其實我們可以獲取它相對于v的偏移量(unsafe.Sizeof可以為我們做這個事),但我上面的代碼并沒有這樣去實現。各位別急,一步步來。

var j *int64 = (*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + uintptr(unsafe.Sizeof(int32(0)))))

其實我們已經知道v是有兩個成員的,包括i和j,并且在定義中,i位于j的前面,而i是int32類型,也就是說i占4個字節。所以j是相對于v偏移了4個字節。您可以用uintptr(4)或uintptr(unsafe.Sizeof(int32(0)))來做這個事。unsafe.Sizeof方法用來得到一個值應該占用多少個字節空間。注意這里跟C的用法不一樣,C是直接傳入類型,而golang是傳入值。之所以轉成uintptr類型是因為需要做指針運算。v的地址加上j相對于v的偏移地址,也就得到了v.j在內存中的絕對地址,別忘了j的類型是int64,所以現在的j就是一個指向v.j的指針,接下來給它賦值:

*j = int64(763)

好吧,現在貌視一切就緒了,來打印下:

v.PutI()
v.PutJ()

如果您看到了正確的輸出,那恭喜您,您做到了!

但是,別忘了上面的代碼其實是有一些問題的,您發現了嗎?

在p目錄下新建w.go文件,代碼如下:

package p

import (
 "fmt"
 "unsafe"
)

type W struct {
 b byte
 i int32
 j int64
}

func init() {
 var w *W = new(W)
 fmt.Printf("size=%d\n", unsafe.Sizeof(*w))
}

需要修改main.go的代碼嗎?不需要,我們只是來測試一下。w.go里定義了一個特殊方法init,它會在導入p包時自動執行,別忘了我們有在main.go里導入p包。每個包都可定義多個init方法,它們會在包被導入時自動執行(在執行main方法前被執行,通常用于初始化工作),但是,最好在一個包中只定義一個init方法,否則您或許會很難預期它的行為)。我們來看下它的輸出:

size=16

等等,好像跟我們想像的不一致。來手動計算一下:b是byte類型,占1個字節;i是int32類型,占4個字節;j是int64類型,占8個字節,1+4+8=13。這是怎么回事呢?這是因為發生了對齊。在struct中,它的對齊值是它的成員中的最大對齊值。每個成員類型都有它的對齊值,可以用unsafe.Alignof方法來計算,比如unsafe.Alignof(w.b)就可以得到b在w中的對齊值。同理,我們可以計算出w.b的對齊值是1,w.i的對齊值是4,w.j的對齊值也是4。如果您認為w.j的對齊值是8那就錯了,所以我們前面的代碼能正確執行(試想一下,如果w.j的對齊值是8,那前面的賦值代碼就有問題了。也就是說前面的賦值中,如果v.j的對齊值是8,那么v.i跟v.j之間應該有4個字節的填充。所以得到正確的對齊值是很重要的)。對齊值最小是1,這是因為存儲單元是以字節為單位。所以b就在w的首地址,而i的對齊值是4,它的存儲地址必須是4的倍數,因此,在b和i的中間有3個填充,同理j也需要對齊,但因為i和j之間不需要填充,所以w的Sizeof值應該是13+3=16。如果要通過unsafe來對w的三個私有成員賦值,b的賦值同前,而i的賦值則需要跳過3個字節,也就是計算偏移量的時候多跳過3個字節,同理j的偏移可以通過簡單的數學運算就能得到。

比如也可以通過unsafe來靈活取值:

package main

import (
 "fmt"
 "unsafe"
)

func main() {
 var b []byte = []byte{'a', 'b', 'c'}
 var c *byte = b[0]
 fmt.Println(*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(c)) + uintptr(1))))
}

關于填充,FastCGI協議就用到了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Golang常用環境變量說明與設置詳解
  • Golang中的變量學習小結
  • golang中值類型/指針類型的變量區別總結
  • Golang常見錯誤之值拷貝和for循環中的單一變量詳解
  • 詳解Golang編程中的常量與變量
  • Golang學習筆記(二):類型、變量、常量
  • Golang 變量申明的三種方式

標簽:東營 滄州 昭通 晉中 駐馬店 瀘州 泰安 阿壩

巨人網絡通訊聲明:本文標題《golang利用unsafe操作未導出變量-Pointer使用詳解》,本文關鍵詞  golang,利用,unsafe,操作,未,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang利用unsafe操作未導出變量-Pointer使用詳解》相關的同類信息!
  • 本頁收集關于golang利用unsafe操作未導出變量-Pointer使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品国产成人久久av盗摄| xnxx国产精品| 欧美一区二区三级| 国产精品美女久久久久av爽李琼 | 国产黄色成人av| 97久久精品人人做人人爽| 91精品国产综合久久福利| 国产精品久久99| 黑人巨大精品欧美一区| 欧美在线播放高清精品| 国产精品美女久久福利网站| 激情成人午夜视频| 6080午夜不卡| 性做久久久久久免费观看| 99久久综合国产精品| 久久久久久久久一| 麻豆精品久久精品色综合| 欧美日韩亚洲国产综合| 亚洲美女一区二区三区| 99re这里都是精品| 国产精品人妖ts系列视频| 国产精品亚洲а∨天堂免在线| 欧美成人一区二区| 日本美女一区二区三区视频| 欧美色图天堂网| 一区二区三区久久久| 91蜜桃视频在线| 亚洲天堂免费看| 大桥未久av一区二区三区中文| 国产午夜精品一区二区| 国产精品一区二区在线观看不卡 | 中文字幕精品一区| 国产综合色在线| 久久新电视剧免费观看| 国产精品亚洲午夜一区二区三区| 精品国产3级a| 国产999精品久久久久久| 亚洲精品一区二区在线观看| 国内精品视频666| 久久久久久久久99精品| 国产乱色国产精品免费视频| 国产精品久久久一区麻豆最新章节| 成人动漫精品一区二区| 亚洲乱码中文字幕综合| 欧美探花视频资源| 日韩不卡一二三区| 精品国产乱码久久久久久牛牛| 国产麻豆欧美日韩一区| 中文字幕中文乱码欧美一区二区| 色综合色综合色综合 | 欧美一区二区三区电影| 国产一区二区在线视频| 国产精品电影一区二区| 在线观看日韩高清av| 日韩在线一区二区| 精品成人在线观看| 93久久精品日日躁夜夜躁欧美| 亚洲自拍偷拍麻豆| 精品国一区二区三区| 成人国产在线观看| 一个色在线综合| 欧美刺激脚交jootjob| 91偷拍与自偷拍精品| 免费观看成人鲁鲁鲁鲁鲁视频| 久久久精品蜜桃| 欧美亚洲动漫制服丝袜| 国产揄拍国内精品对白| 亚洲日本丝袜连裤袜办公室| 欧美精品v国产精品v日韩精品| 国产ts人妖一区二区| 午夜精品一区二区三区电影天堂| 久久色成人在线| 欧美午夜电影一区| 成人福利在线看| 久久99久久精品欧美| 亚洲女性喷水在线观看一区| 日韩亚洲欧美中文三级| 色网综合在线观看| 看电视剧不卡顿的网站| 亚洲黄色小视频| 久久综合国产精品| 欧美精品久久99| 91视频一区二区| 国产精品18久久久久久久久 | 成人免费福利片| 久久精品国产亚洲a| 午夜伊人狠狠久久| 国产精品美日韩| 国产网站一区二区三区| 欧美一区二区三区免费大片| 欧美在线短视频| 99久久精品免费看| 国产一区二区电影| 青娱乐精品在线视频| 亚洲一区精品在线| 亚洲男人的天堂网| 久久精子c满五个校花| 日韩免费视频线观看| 欧美日本国产视频| 欧美三级蜜桃2在线观看| 色婷婷精品大视频在线蜜桃视频 | 678五月天丁香亚洲综合网| 色美美综合视频| av成人免费在线| 成人国产亚洲欧美成人综合网| 国产黄色精品视频| 成人免费视频播放| 国产a级毛片一区| 粉嫩久久99精品久久久久久夜| 国产一区二区三区| 国产在线精品免费av| 极品少妇xxxx精品少妇| 久久精品国产第一区二区三区| 日韩经典中文字幕一区| 日本sm残虐另类| 美腿丝袜亚洲三区| 激情五月婷婷综合网| 国产高清在线精品| 丁香五精品蜜臀久久久久99网站 | 91看片淫黄大片一级在线观看| 成人精品高清在线| av一区二区不卡| 一本久久综合亚洲鲁鲁五月天| 色94色欧美sute亚洲线路二| 欧美日韩国产中文| 日韩欧美一区二区视频| 久久天天做天天爱综合色| 国产欧美精品在线观看| 亚洲精品中文字幕乱码三区| 一区二区三区在线免费播放| 日韩国产欧美一区二区三区| 日韩高清不卡一区| 国产精一品亚洲二区在线视频| 成人免费视频视频在线观看免费| 色香色香欲天天天影视综合网| 欧美日本视频在线| 久久精品欧美日韩| 亚洲免费三区一区二区| 亚洲国产精品麻豆| 激情成人午夜视频| 91理论电影在线观看| 日韩视频123| 亚洲欧洲99久久| 五月激情综合网| 国产福利一区在线观看| 一本久久综合亚洲鲁鲁五月天 | 91高清视频免费看| 欧美一区二区成人| 中文字幕永久在线不卡| 奇米一区二区三区| 日韩国产精品久久久| 国产91精品在线观看| 欧美夫妻性生活| 国产欧美日韩在线观看| 丝袜美腿一区二区三区| 成人黄色在线网站| 欧美成人a∨高清免费观看| 亚洲欧洲av一区二区三区久久| 美女网站色91| 92精品国产成人观看免费| 日韩免费观看2025年上映的电影| 亚洲靠逼com| 不卡影院免费观看| 日韩欧美aaaaaa| 午夜在线电影亚洲一区| 91伊人久久大香线蕉| 久久综合久久99| 秋霞午夜av一区二区三区| 在线观看日韩精品| 专区另类欧美日韩| 粉嫩嫩av羞羞动漫久久久 | 久久影院午夜论| 亚洲在线免费播放| av高清不卡在线| 欧美激情中文不卡| 激情小说亚洲一区| 亚洲曰韩产成在线| 韩日av一区二区| 欧美日韩国产综合视频在线观看| 中文字幕制服丝袜成人av | 欧美日韩一区久久| 中文字幕一区二区三区av | 国内欧美视频一区二区| 欧美丰满一区二区免费视频 | 欧美电视剧在线看免费| 午夜欧美电影在线观看| 在线免费观看成人短视频| 中文字幕一区二区三| 成人激情视频网站| 国产精品国产精品国产专区不片| 国产成人综合网| 国产精品你懂的在线欣赏| 国产sm精品调教视频网站| 欧美激情综合五月色丁香小说| 激情五月婷婷综合| 国产欧美精品一区二区色综合| 国产999精品久久久久久| 日韩一区在线看| 91麻豆福利精品推荐| 亚洲自拍偷拍网站|