成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

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

前言

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

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

在$GOPATH/src下建立poit包,并在poit下建立子包p,目錄結(jié)構(gòu)如下:

$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包來實(shí)現(xiàn)對(duì)V的成員i和j賦值,然后通過PutI()和PutJ()來打印觀察輸出結(jié)果。

以下是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()
}

當(dāng)然會(huì)有些限制,比如需要知道結(jié)構(gòu)體V的成員布局,要修改的成員大小以及成員的偏移量。我們的核心思想就是:結(jié)構(gòu)體的成員在內(nèi)存中的分配是一段連續(xù)的內(nèi)存,結(jié)構(gòu)體中第一個(gè)成員的地址就是這個(gè)結(jié)構(gòu)體的地址,您也可以認(rèn)為是相對(duì)于這個(gè)結(jié)構(gòu)體偏移了0。相同的,這個(gè)結(jié)構(gòu)體中的任一成員都可以相對(duì)于這個(gè)結(jié)構(gòu)體的偏移來計(jì)算出它在內(nèi)存中的絕對(duì)地址。

具體來講解下main方法的實(shí)現(xiàn):

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

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

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

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

*i = int32(98)

現(xiàn)在已經(jīng)成功的改變了v的私有成員i的值,好開心_

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

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

其實(shí)我們已經(jīng)知道v是有兩個(gè)成員的,包括i和j,并且在定義中,i位于j的前面,而i是int32類型,也就是說i占4個(gè)字節(jié)。所以j是相對(duì)于v偏移了4個(gè)字節(jié)。您可以用uintptr(4)或uintptr(unsafe.Sizeof(int32(0)))來做這個(gè)事。unsafe.Sizeof方法用來得到一個(gè)值應(yīng)該占用多少個(gè)字節(jié)空間。注意這里跟C的用法不一樣,C是直接傳入類型,而golang是傳入值。之所以轉(zhuǎn)成uintptr類型是因?yàn)樾枰鲋羔樳\(yùn)算。v的地址加上j相對(duì)于v的偏移地址,也就得到了v.j在內(nèi)存中的絕對(duì)地址,別忘了j的類型是int64,所以現(xiàn)在的j就是一個(gè)指向v.j的指針,接下來給它賦值:

*j = int64(763)

好吧,現(xiàn)在貌視一切就緒了,來打印下:

v.PutI()
v.PutJ()

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

但是,別忘了上面的代碼其實(shí)是有一些問題的,您發(fā)現(xiàn)了嗎?

在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里定義了一個(gè)特殊方法init,它會(huì)在導(dǎo)入p包時(shí)自動(dòng)執(zhí)行,別忘了我們有在main.go里導(dǎo)入p包。每個(gè)包都可定義多個(gè)init方法,它們會(huì)在包被導(dǎo)入時(shí)自動(dòng)執(zhí)行(在執(zhí)行main方法前被執(zhí)行,通常用于初始化工作),但是,最好在一個(gè)包中只定義一個(gè)init方法,否則您或許會(huì)很難預(yù)期它的行為)。我們來看下它的輸出:

size=16

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

比如也可以通過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))))
}

關(guān)于填充,F(xiàn)astCGI協(xié)議就用到了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

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

標(biāo)簽:東營 滄州 昭通 晉中 駐馬店 瀘州 泰安 阿壩

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解》,本文關(guān)鍵詞  golang,利用,unsafe,操作,未,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产女人水真多18毛片18精品| 黄色大片在线观看| 亚洲国产精品人人做人人爽| 黑人巨大精品欧美一区二区| 一本久道综合色婷婷五月| 日本特黄在线观看| 日本欧美一区二区三区乱码| 亚洲精品成人a| 久久精品久久久久久国产 免费| 九九热在线视频观看| 在线观看黄av| 久草视频在线资源| 亚洲高清在线精品| 日韩丝袜情趣美女图片| 日韩一区精品视频| 日本福利一区二区| 欧美mv日韩mv| xxx欧美尤物xxx| 久久精品欧洲| 亚洲欧美激情在线观看| 小舞被吸乳羞羞网站视频| 国产成人精品综合在线观看| 免费一级欧美片在线观看网站| 日本欧美一级片| 欧美三区在线| 操你啦视频分享| а√最新版在线天堂| 国产精品香蕉av| 国产精品污网站| 亚洲精品白虎| 国产在线导航| 国产精品久久久久免费a∨大胸| 欧美性xxxx极品hd满灌| 国产精品186在线观看在线播放| 天堂中文字幕一二区| 91情侣偷在线精品国产| www.五月天色| aa级大片免费在线观看| 8x福利精品第一导航| 福利网站av| 男人的天堂a在线| 亚洲不卡在线观看| 亚洲怡红院在线| 青草青草久热精品视频在线观看| 欧美日韩国产精品一区二区三区四区| 亚洲 自拍 另类小说综合图区| 亚洲福利视频一区| 欧美一区二区综合| 999国产精品| 国产91露脸合集magnet| 国产精品免费网站| 99久久国产免费免费| 9色视频在线观看| 欧美午夜精品一区| 久久电影在线| 国内外成人激情免费视频| 国产日韩欧美不卡| 在线天堂一区av电影| a毛片在线播放| 久久综合久久美利坚合众国| xxxx视频在线观看| 久草成色在线| 高清美女视频一区| 成人的网站免费观看| 久久99国产综合精品女同| 国产视频福利一区| 少妇一区视频| 亚洲黄色激情视频| 欧美无遮挡国产欧美另类| 亚洲影院久久精品| 亚洲乱码国产乱码精品精的特点| 久久国产精品精品国产色婷婷| 狠狠爱一区二区三区| 国产在线拍偷自揄拍精品| 天堂中文av在线资源库| 日本丰满少妇xxxx| 国产精品香蕉国产| 日韩高清在线一区二区| 久久亚洲精精品中文字幕早川悠里| 久久亚洲欧洲| 久久亚洲a v| 精品亚洲第一| 亚洲欧美综合另类中字| 一色桃子久久精品亚洲| 日韩网站在线看片你懂的| 一区二区久久久久| 国产精品久久999| а√中文在线天堂精品| √天堂资源地址在线官网| 成人三级av在线| 免费观看亚洲视频大全| 日韩成人精品在线观看| 97精品视频在线观看自产线路二| 色香色香欲天天天影视综合网| 欧美极品aⅴ影院| 国产福利资源在线| 日韩二区三区| 亚洲欧洲日韩精品| 国产十六处破外女视频| 91精品国产高清一区二区三蜜臀| 亚洲婷婷国产精品电影人久久| 久久亚洲国产中v天仙www| 一色桃子一区二区| 五月色婷婷综合| 香蕉网站在线| 97精品国产一区二区三区| 亚洲精品久久久久久国| 日韩av在线免费播放| 国产伦精品一区二区三区视频痴汉| 欧美三级日韩三级国产三级| 中文字幕在线不卡国产视频| 午夜午夜精品一区二区三区文| 久久免费电影| 国产欧美一区二区三区精品观看| 欧美天堂一区二区| 一路向西2在线观看| 日韩午夜在线影院| 亚洲天堂av资源在线观看| 亲爱的老师9免费观看全集电视剧| 精品国产乱码久久久久久樱花| 日韩欧国产精品一区综合无码| 国产精品女人久久久久久| 手机看片国产精品| 日韩视频―中文字幕| 亚洲一区精品在线观看| 色综合天天在线| 91蜜桃在线观看| 中文字幕国产欧美| av网站大全免费| 在线观看免费视频一区二区三区| 精品人妻无码中文字幕18禁| www.日本不卡| 国产成人aaaa| 91精品久久久久久综合乱菊| 精品免费视频一区二区| 欧美一区二区观看视频| 久久亚洲综合| 九九热视频精品在线观看| 美女视频网站黄色亚洲| 久热中文字幕| 精品视频1区2区| 免费成人av| 岛国在线视频| 国产高潮呻吟久久| 日韩高清专区| 成人综合电影| 自拍偷拍福利视频| 国产精品久久久久久久午夜| www.av精品| 91美女精品福利| 亚洲码无人客一区二区三区| 国产亚洲在线播放| yjizz视频网站在线播放| 人人做人人爽人人爱| 欧美美女搞黄| 欧美尿孔扩张虐视频| 最新欧美电影| 电影天堂爱爱爱爱| 97超碰人人模人人人爽人人爱| 精品成人国产在线观看男人呻吟| 国产精品爱久久久久久久小说| 尤物tv国产一区| 精品视频123区在线观看| 中文字幕区一区二区三| 久久精品视频在线观看| 亚州精品天堂中文字幕| 欧美乱大交做爰xxxⅹ性3| 国产免费一级片| 中文字幕第20页| 精品视频站长推荐| 国产永久免费视频| 波多野结衣有码| 国产成人免费视频网站视频社区| 青娱乐精品在线| 成人中文字幕合集| 亚洲色图校园春色| 免费一区二区| 亚洲日本久久久| 97人妻精品一区二区免费| 欧美日韩三级在线观看| 免费看的国产视频网站| 久久香蕉综合色| 欧美电影一区| 欧美色图激情小说| 天堂在线中文在线| 99国产精品99久久久久久粉嫩| 在线亚洲a色| 黄色片网址在线观看| 成人动漫av在线| 在线人成日本视频| 国产一区二区三区黄网站| 久久99成人| 91香蕉视频在线观看视频| 亚洲欧美一区二区三区| 日韩精品在线观看一区二区| 欧美一级淫片免费视频魅影视频| 99av国产精品欲麻豆| 少妇高潮喷水在线观看| 久久99精品久久久久久园产越南| 欧美精品hd| 欧美精品总汇| 色综合视频二区偷拍在线| 91精品国产经典在线观看| 久久99偷拍| 在线黄色av网站| 在线观看免费黄色小视频| 国产熟妇一区二区三区四区| 中文字幕不卡| 国产精品免费不| 综合天天久久| 国产精品v欧美精品∨日韩| 成人v精品蜜桃久久一区| 国产精品wwwww| 亚洲国语精品自产拍在线观看| japanese在线播放| 欧美久久久网站| 欧美2区3区4区| 亚洲第一成人av| 在线播放中文字幕| 欧美性色视频在线| 18被视频免费观看视频| 国产精品国产三级国产aⅴ浪潮| 欧美成人se01短视频在线看| 高清中文字幕一区二区三区| 国产精品一区二区av日韩在线| 日本午夜精品电影| 网站一区二区三区| 日韩少妇内射免费播放| 日韩久久一区二区三区| 扒开腿狂躁女人爽出白浆2| 成人免费视频网站| 91网址在线播放| 视频一区在线免费观看| 亚洲欧美日本视频在线观看| 日韩欧美大片在线观看| 蜜桃伊人久久| 人人妻人人澡人人爽精品欧美一区| 1024手机看片国产| 欧美日高清视频| 午夜日韩电影| 成人黄色大片网站| 国产大尺度在线观看| 黄色片免费在线观看| 国产一区二区三区高清播放| av影院午夜一区| 91免费在线播放| xxxxxx欧美| 一区二区三区免费看视频| 国产高清在线一区二区| 欧美亚洲愉拍一区二区| **女人18毛片一区二区| 国产 日韩 欧美在线| 亚洲精品久久久久久一区二区| 狠狠躁夜夜躁av无码中文幕| 欧美久久一二三四区| 国产偷人视频免费| 在线看片日韩| 亚洲性色视频| 欧美色图中文字幕| 97精品国产97久久久久久| 日韩电影免费观看在线观看| 色戒汤唯在线观看| 24小时成人在线视频| 91资源在线视频| 久久99精品国产91久久来源| 国产亚洲一本大道中文在线| 成人av小说网| 欧美激情成人网| 精品久久久久久久久久岛国gif| 国产在线麻豆精品观看| 九九热线视频只有这里最精品| 97在线精品视频| 欧美日韩在线观看一区二区| jizzjizz在线| 香蕉网站在线| 91福利国产在线观看菠萝蜜| 成人亚洲精品| 秋霞精品一区二区三区| 天天色天天色| 欧洲另类一二三四区| 李宗瑞系列合集久久| 亚洲激精日韩激精欧美精品| 欧美日韩在线观看免费| 欧美午夜欧美| 日本免费一级视频| 免费视频拗女稀缺一区二区| www.精品国产| 在线视频第一页| 日韩欧美高清一区二区三区| a视频在线观看免费| 国产原创剧情av| 99久久综合狠狠综合久久aⅴ| 亚洲熟妇无码一区二区三区导航| 欧美性猛交xxxx| 中文字幕亚洲精品一区| 日韩精品免费在线视频观看| 三级黄色在线观看| 国产欧美精品| 成人video亚洲精品| 中文字幕亚洲一区二区三区五十路| 三级网站在线免费观看| 夜级特黄日本大片_在线| 亚洲网站三级| 亚洲精品一区视频| 久久久pmvav| 亚洲精品无码久久久久久久| 自拍偷拍中文字幕| 国产精品久久久久久久久免费| mm131午夜| 亚洲性猛交xxxx乱大交| 欧洲精品国产| 欧美精品福利视频| 青草久久伊人| 亚洲老头老太hd| 色一情一交一乱一区二区三区| 亚洲黄色免费| 翔田千里一区二区| 在线播放豆国产99亚洲| 免费看日产一区二区三区| 精品96久久久久久中文字幕无| 久久日本片精品aaaaa国产| 国产精品xxx在线观看www| 91欧美一区二区三区| 国内在线高清免费视频| 国产又爽又黄免费视频| 亚洲色图美女| 91影院在线免费观看| 美女免费视频黄|