欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 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使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产精品18在线| 国产精品久久看| 亚洲v日本v欧美v久久精品| 99久久婷婷国产综合精品电影| 国产精品18在线| 国产偷国产偷亚洲高清人白洁 | 国产日韩精品一区二区浪潮av| 免费观看久久久4p| 最新中文字幕视频| 精品国产网站在线观看| 男男gaygay亚洲| x88av在线| 国产三级一区二区| 国产 欧美在线| 久热这里有精品| av女人的天堂| 久久精品亚洲一区二区三区浴池| 激情图区综合网| 蜜桃av免费在线观看| 国产女人aaa级久久久级| 国产高清视频一区| 中文字幕影音先锋| 亚洲精品亚洲人成人网| 乱码一区二区三区| 日韩欧美一区二区免费| 捆绑变态av一区二区三区| 一区二区伦理片| 国产精品天美传媒| av在线综合网| 制服丝袜在线91| 久久爱另类一区二区小说| 国产3级在线观看| 中文字幕一区二区三区不卡| 91丨porny丨中文| 678五月天丁香亚洲综合网| 蜜臀99久久精品久久久久久软件| 少妇愉情理伦三级| 18涩涩午夜精品.www| 国产一精品一aⅴ一免费| 欧美大黄免费观看| 国产成人精品亚洲日本在线桃色 | 韩国一区二区视频| 在线观看亚洲网站| 亚洲一区二区三区四区在线免费观看 | 国产女主播喷水高潮网红在线| 久久久久久亚洲综合影院红桃| 国产a区久久久| 欧美三电影在线| 久久er精品视频| 一本久道中文字幕精品亚洲嫩| 亚洲国产欧美在线| 欧美丰满老妇熟乱xxxxyyy| 亚洲欧美一区二区在线观看| 美女伦理水蜜桃4| 久久人人97超碰com| 99精品视频在线播放观看| 91精品欧美综合在线观看最新| 狠狠色丁香婷婷综合| 久久久久久久久久网站| 色婷婷久久久亚洲一区二区三区 | 综合久久久久久久| 无码任你躁久久久久久老妇| 国产欧美一区二区三区网站| 9191在线视频| 国产偷国产偷亚洲高清人白洁| 佐佐木明希电影| 欧美国产1区2区| 午夜av免费看| 中文字幕五月欧美| 欧美色图亚洲激情| 亚洲靠逼com| 久久久久久国产免费a片| 一区二区在线免费观看| 国产一区二区三区精品在线| 亚洲国产一区二区三区青草影视 | 中文字幕在线不卡| 三级黄色片网站| 亚洲人123区| 国产精品久久免费观看| 午夜在线电影亚洲一区| 男人操女人的视频网站| 青娱乐精品视频| 欧美亚洲国产bt| 国产成人av福利| 精品黑人一区二区三区久久| 三上悠亚 电影| 国产精品麻豆久久久| 国产福利短视频| 亚洲国产成人精品视频| 中文字幕在线观看成人| 久久国内精品自在自线400部| 欧美色网站导航| 成人黄色小视频| 久久久国产精华| 亚洲黄色在线网站| 亚洲成人第一页| 欧美在线看片a免费观看| 风间由美一区二区av101| 精品少妇一区二区三区免费观看 | 亚洲色图在线播放| 色偷偷男人天堂| 麻豆91精品91久久久的内涵| 欧美精品自拍偷拍| 手机看片国产精品| 亚洲色图欧美在线| 久久中文免费视频| 国产精品一区二区免费不卡 | 国产精品大尺度| 手机av在线不卡| 久久99国产精品麻豆| 日韩手机在线导航| 中文字幕免费在线播放| 亚洲成人7777| 在线观看91av| 蜜臀aⅴ国产精品久久久国产老师 性活交片大全免费看 | 欧美色视频在线| 91免费看片在线观看| 亚洲人被黑人高潮完整版| 69xx绿帽三人行| 成人美女视频在线观看18| 国产午夜精品一区二区三区嫩草| 国产sm调教视频| 精品写真视频在线观看| 精品粉嫩aⅴ一区二区三区四区| aaaaa级少妇高潮大片免费看| 秋霞电影网一区二区| 欧美成人伊人久久综合网| 亚洲AV无码国产精品| 日本在线不卡视频| 日韩精品一区二区三区四区| 色婷婷av777| 韩国一区二区在线观看| 久久久久久久久97黄色工厂| 青青青手机在线视频| 国产精品77777竹菊影视小说| 久久久久国产精品免费免费搜索| 亚洲精品一区二区三区影院忠贞| 久久国产精品99久久久久久老狼| 2023国产精华国产精品| 日本在线观看网址| 成人国产视频在线观看| 一区二区三区中文免费| 欧美日本精品一区二区三区| av无码一区二区三区| 免费av成人在线| 国产三级欧美三级日产三级99 | 国产午夜手机精彩视频| www.av亚洲| 亚洲午夜一区二区| 欧美一区二区三区免费观看视频 | 成人黄色免费短视频| 亚洲欧美日韩在线不卡| 欧美日韩一区二区欧美激情| 国产视频久久久久久| 久久精品国产亚洲5555| 国产欧美一区二区三区鸳鸯浴| 色一情一乱一乱一91av| 成熟妇人a片免费看网站| 久久精品国产第一区二区三区| 久久久99精品免费观看不卡| 久久精品黄色片| 中文字幕在线国产| 黑人巨大精品欧美黑白配亚洲| 国产精品美女久久久久久久| 欧美性色综合网| 深爱五月激情网| 粉嫩av一区二区三区| 亚洲一区二区在线免费观看视频| 日韩一卡二卡三卡四卡| 亚洲a∨无码无在线观看| 亚洲一区二区三区三州| 美女一区二区视频| 中文字幕一区二区三区四区不卡| 欧美日韩高清一区二区| x88av在线| 初高中福利视频网站| 久久国产三级精品| 亚洲人成人一区二区在线观看| 欧美一区二区三区四区在线观看 | 免费一级片91| 国产精品久久精品日日| 欧美一卡在线观看| av成人免费网站| 青青草福利视频| 99久久国产综合精品女不卡| 美国十次综合导航| 亚洲美女视频在线观看| 欧美精品一区二区在线播放| 欧洲人成人精品| 久久久久久国产免费a片| av不卡中文字幕| 国产99精品在线观看| 日韩精品一级二级| 最新不卡av在线| 精品久久久久av影院| 欧美艳星brazzers| 国产又粗又长又硬| 一区二区视频观看| 欧美体内she精高潮| 国产精品一区专区|