精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

注釋竟然還有特殊用途?一文解惑 //go:linkname 指令

開發 后端
Go 中類似的指令挺多的,比如 Go1.16 中的 //go:embed。前些天有人問我,為什么它用 //go:embed 不起作用?我一看,它是這么寫的:// go:embed,不知道你看到問題了沒有?

 

我之前寫過一篇文章:為什么 Go 標準庫中有些函數只有簽名,沒有函數體?,其中有一點就是 //go:linkname 這個指令。

Go 中類似的指令挺多的,比如 Go1.16 中的 //go:embed。前些天有人問我,為什么它用 //go:embed 不起作用?我一看,它是這么寫的:// go:embed,不知道你看到問題了沒有?是的,指令是通過注釋的方式,但有三點要求,要特別注意:

  • // 后不能有空格。有些人可能習慣 // 后不加空格。但一般認為,// 后應該加一個空格。不過 go 指令卻要求不能有空格,這是一個小“坑”,得注意。所以上面那位朋友就是加了空格,導致出問題。(程序并不會報錯,只是沒有得到自己想要的結果)
  • 代碼和指令之間不能有空行或其他注釋。這一點應該還好,很多人不會用錯吧;
  • 一般來說,使用指令需要導入相應的包。比如 //go:linkname 指令要求導入 unsafe 包,一般會 import _ "unsafe”,//go:embed 指令,要求導入 embed 包。

有另外一位 Go 朋友「橘中秘士」微信私聊我:

大佬好,能不能寫一篇 linkname 的文章。目前已經有了一些初步概念,但是尚有一些疑團不是特別清晰。

//go:linkname localname remotename,其中 local 作為占位符 remote 作為實現者或者 local 作為實現者 remote 作為占位符都是可以的。目前理解的就是給 Symbol 添加了一個 Linkname,查找 Symbo l的時候用 remote。

譬如 //go:linkname runtimeNano runtime.nanotime,runtimeNano 作為占位符 runtime.nanotime 提供實現,任何調用 runtimeNano 的地方實際替換為對 runtime.nanotime 的調用,這種場景比較容易接受。

譬如 //go:linkname runtime_cmpstring runtime.cmpstring,runtime_cmpstring 提供實現 runtime.cmpstring作為占位符,是不是這時符號表里不存在 runtime_cmpstring 只有 runtime.cmpstring?

經過簡單溝通,他寫了一篇文章解決自己的困惑。希望對各位有幫助。以下是他寫的關于 //go:linkname 的文章(我做了一些調整)。

01 格式

  1. //go:linkname local remote 

remote 可以沒有,此時 remote 使用 local 的值,效果就是 local 被導出。

02 local 和 remote 同時為函數

local 作為占位符,remote 作為實現者

標準庫中的例子:

  1. // 來自 time 包 
  2. //go:linkname runtimeNano runtime.nanotime 
  3. func runtimeNano() int64 
  4.  
  5. // 來自 runtime 包 
  6. //go:nosplit 
  7. func nanotime() int64 { 
  8.  return nanotime1() 

此時二進制文件中并沒有runtimeNano,直接轉化為對runtime.nanotime的調用。

local 作為實現者,remote 作為占位符

同樣來自標準庫。這里存在函數沒有函數體,但是被反向引用。

  1. // 在標準庫的一個 internal 中 
  2. //go:linkname runtime_cmpstring runtime.cmpstring 
  3. func runtime_cmpstring(a, b string) int { 
  4.  l := len(a) 
  5.  if len(b) < l { 
  6.   l = len(b) 
  7.  } 
  8.  for i := 0; i < l; i++ { 
  9.   c1, c2 := a[i], b[i] 
  10.   if c1 < c2 { 
  11.    return -1 
  12.   } 
  13.   if c1 > c2 { 
  14.    return +1 
  15.   } 
  16.  } 
  17.  if len(a) < len(b) { 
  18.   return -1 
  19.  } 
  20.  if len(a) > len(b) { 
  21.   return +1 
  22.  } 
  23.  return 0 
  24.  
  25. // 來自 runtime 
  26. func cmpstring(string, string) int 

此時二進制文件中并沒有runtime_cmpstring,對應的函數已經被命名為runtime.cmpstring。也就是說,實現在 internal 包,但最終通過 runtime.cmpstring 來引用。

一個占位符+一個匯編函數

  1. // 在標準庫的一個 internal 中 
  2. //go:linkname abigen_runtime_memequal runtime.memequal 
  3. func abigen_runtime_memequal(a, b unsafe.Pointer, size uintptr) bool 

注意runtime.memequal的實現并不在runtime包中,使用匯編實現的話并不要求必須在相應的包中。

  1. # memequal(a, b unsafe.Pointer, size uintptr) bool 
  2. TEXT runtime·memequal(SB),NOSPLIT,$0-25 
  3.     MOVQ    a+0(FP), SI 
  4.     MOVQ    b+8(FP), DI 
  5.     CMPQ    SI, DI 
  6.     JEQ eq 
  7.     MOVQ    size+16(FP), BX 
  8.     LEAQ    ret+24(FP), AX 
  9.     JMP memeqbody<>(SB) 
  10. eq: 
  11.     MOVB    $1, ret+24(FP) 
  12.     RET 

03 local 和 remote 同時為變量

兩個常規變量

  1. //go:linkname overflowError runtime.overflowError 
  2. var overflowError error 
  3.  
  4. //go:linkname divideError runtime.divideError 
  5. var divideError error 
  6.  
  7. //go:linkname zeroVal runtime.zeroVal 
  8. var zeroVal [maxZero]byte 
  9.  
  10. //go:linkname _iscgo runtime.iscgo 
  11. var _iscgo bool = true 
  12.  
  13. //go:cgo_import_static x_cgo_setenv 
  14. //go:linkname x_cgo_setenv x_cgo_setenv 
  15. //go:linkname _cgo_setenv runtime._cgo_setenv 
  16. var x_cgo_setenv byte 
  17. var _cgo_setenv = &x_cgo_setenv 
  18.  
  19. //go:cgo_import_static x_cgo_unsetenv 
  20. //go:linkname x_cgo_unsetenv x_cgo_unsetenv 
  21. //go:linkname _cgo_unsetenv runtime._cgo_unsetenv 
  22. var x_cgo_unsetenv byte 
  23. var _cgo_unsetenv = &x_cgo_unsetenv 

一個占位符+一個偽符號

  1. //go:linkname runtime_inittask runtime..inittask 
  2. var runtime_inittask initTask 
  3.  
  4. //go:linkname main_inittask main..inittask 
  5. var main_inittask initTask 

注意是..inittask不是.inittask,而且.inittask只存在于編譯階段,任何包中都無法聲明該變量。

這里額外解釋下 ..inittask 為什么兩個點。第一個點就是普通的 runtime. 這種調用方式,第二個點和 inittask 一起構成一個符號(變量)。注意,Go 中的變量是不允許以 . 開頭的,所以,這個叫偽符號,只在不編譯階段存在。

04 一個例子

研究 //go:linkname 是因為如下的背景:

Java 里有 InheritableThreadLocal,SpringWeb 在 ServletActionContext 里使用它,達到在任何地方都能方便的獲取HttpServletRequest。

Go 并沒有提供類似的機制,即使通過 stack 找到 goroutine id(99% 的文章都是這么介紹的),再配合 sync.Map,也只是實現了一個比較粗糙的 ThreadLocal,在子協程里仍然獲取不到父協程的內容。

g.label 雖然不是給這種場景準備的,但它具備了 InheritableThreadLocal 的一切要求,只要我們能夠訪問到 label 私有字段,我們就有了完整版的 InheritableThreadLocal。

下面這個例子是作者真實項目中用的。

在 runtime 和 runtime/pprof 包中有兩個函數:runtime_setProfLabel 和 runtime_getProfLabel。其中,runtime 包中的提供了實現,而 pprof 中的沒有提供實現。如果基于它們創建另外的函數,如下:

  1. //go:linkname SetPointer runtime/pprof.runtime_setProfLabel 
  2. func SetPointer(ptr unsafe.Pointer) 
  3.  
  4. //go:linkname GetPointer runtime/pprof.runtime_getProfLabel 
  5. func GetPointer() unsafe.Pointer 

根據前面的分析,雖然runtime.runtime_setProfLabel/runtime.runtime_getProfLabel提供了函數實現,但是二進制文件中并不會出現(見下方代碼),此時想要調用必須通過runtime/pprof.runtime_setProfLabel/runtime/pprof.runtime_getProfLabel,這也是上面linkname到pprof而不是runtime的根本原因。

  1. // 來自 runtime 包 
  2. //go:linkname runtime_setProfLabel runtime/pprof.runtime_setProfLabel 
  3. func runtime_setProfLabel(labels unsafe.Pointer) { 
  4.  if raceenabled { 
  5.   racereleasemerge(unsafe.Pointer(&labelSync)) 
  6.  } 
  7.  getg().labels = labels 
  8.  
  9. // 來自 runtime/pprof 包 
  10. func runtime_setProfLabel(labels unsafe.Pointer) 
  11.  
  12. // 來自 runtime 包 
  13. //go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel 
  14. func runtime_getProfLabel() unsafe.Pointer { 
  15.  return getg().labels 
  16.  
  17. // 來自 runtime/pprof 包 
  18. func runtime_getProfLabel() unsafe.Pointer 

05 總結

Go 中有不少指令,有些指令你可能不太需要關心,也不會用到。然而有些指令了解它們的意思,對閱讀相關代碼很有幫助。

這篇文章全面介紹了 //go:linkname 指令,不知道是否徹底解除了你的疑惑?歡迎留言交流!

本文轉載自微信公眾號「polarisxu」,可以通過以下二維碼關注。轉載本文請聯系polarisxu公眾號。

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2019-10-28 10:19:27

JVM 類加載器Java

2024-04-26 00:01:00

Go語言類型

2023-01-09 08:14:08

GoHttpServer

2022-11-09 09:15:31

ProtoBufGo語言

2023-03-14 09:03:20

Go語法腳本

2021-02-02 09:10:12

Go語言二進制

2021-09-27 07:39:52

Go初始化函數package

2021-12-20 07:59:07

Go語言結構體

2023-06-01 16:27:34

匯編語言函數

2023-11-25 09:41:34

GogRPCHandler

2020-03-31 14:40:24

HashMap源碼Java

2024-04-12 12:19:08

語言模型AI

2020-08-27 07:34:50

Zookeeper數據結構

2021-08-04 16:06:45

DataOps智領云

2020-10-26 09:18:50

RedisCluste

2022-03-24 08:51:48

Redis互聯網NoSQL

2023-12-22 19:59:15

2021-01-26 05:19:56

語言Go Context

2024-03-26 00:17:51

Go語言IO

2023-11-20 08:18:49

Netty服務器
點贊
收藏

51CTO技術棧公眾號

欧美黑人猛猛猛| 天堂av在线网| 日韩成人三级视频| 91国偷自产一区二区三区成为亚洲经典| 亚洲成人av观看| 99国产精品白浆在线观看免费| 一区二区三区在线观看国产| 成人国产精品入口免费视频| 毛片网站免费观看| 国产69精品久久久久99| 国产a精品视频| 成人在线影视| 国产精品久久久久久9999| 在线不卡国产精品| 日日骚欧美日韩| 麻豆av电影在线观看| 激情五月开心婷婷| 亚洲性线免费观看视频成熟| 老司机一区二区三区| 国产香蕉视频在线看| 蜜臀视频一区二区三区| 国产午夜精品视频| 日韩成人午夜精品| 欧美极品视频| 可以看的av网址| 久久久久久18| 久久网站热最新地址| 欧美日韩尤物久久| 国产性生活大片| 国产伦理一区二区三区| 富二代精品短视频| 日韩精品一卡| 亚洲精品视频91| 人妻无码视频一区二区三区| 中文字幕日韩在线观看| 国产精品一区二区你懂的| av影院在线| 日韩亚洲欧美中文字幕| 国产传媒一区二区三区| 欧美伊人久久久久久久久影院| 欧美成人69| 国产在线一二三| 中文字幕第九页| 国产色视频一区| 欧美日韩国产精品一区| 国产精品久久久久无码av| 全色精品综合影院| 好吊操视频这里只有精品| 国产精品十八以下禁看| 亚洲.国产.中文慕字在线| 日韩在线理论| www.亚洲.com| 国产男女猛烈无遮挡a片漫画| 91嫩草免费看| 欧美精品123区| 久久er精品视频| 亚洲a∨精品一区二区三区导航| 九九热国产在线| 一区二区视频在线播放| 亚洲欧美精品suv| 久久久久久亚洲综合| 噜噜噜狠狠夜夜躁精品仙踪林| av天堂一区二区三区| 91av视频免费观看| 亚洲最大福利视频网| 9191国产精品| 国产成人自拍在线| 日韩欧美中文字幕一区二区三区| 国产精品视频久久久久久| 国产成年人视频网站| 成人国产精品一区| 精品国产在天天线2019| 国产**成人网毛片九色 | 欧美一区二区三区黄片| 无码国产精品一区二区免费式直播| 成人性生交大片免费看小说| 91精品欧美久久久久久动漫| 国产麻豆欧美日韩一区| 亚洲啊v在线免费视频| 人妻少妇精品无码专区| 欧美老熟妇乱大交xxxxx| 久久久成人av| 一区二区三区在线观看免费| 日韩精品视频无播放器在线看 | 午夜av电影一区| 亚洲综合欧美| 亚洲精品伦理| 婷婷国产在线| 希岛爱理中文字幕| 欧美视频第一区| 91香蕉亚洲精品| 亚洲人成电影网站色…| 一区二区三区小说| 久久精品国产一区二区三 | 亚洲一二三级电影| 日韩在线播放一区二区| 国产毛片精品| 羞羞网站在线免费观看| 亚洲午夜无码久久久久| 欧美激情 亚洲| 99久热在线精品视频| 国产一区二区在线免费视频| 日韩精品久久久久久福利| 一区二区三区在线免费观看| 看片的网站亚洲| 久久国产影院| 国产人妖一区| 精品视频在线一区二区| 中文在线字幕免费观| 韩国三级hd中文字幕| 手机看片福利盒子久久| 日本在线高清视频一区| 国产精品黄视频| 中文字幕不卡av| 欧美日韩免费高清一区色橹橹 | 蜜桃视频在线观看成人| 性欧美视频videos6一9| 亚洲黄页视频免费观看| 精品国产乱码久久久久久天美| 成人国产精品免费观看视频| 亚洲啪啪91| 国产探花在线精品一区二区| 国产v综合v| 国产三区在线观看| 性少妇videosexfreexxx片| 久久久久久国产精品免费播放| 农村末发育av片一区二区| 久久久久久免费看| 日韩久久久久久久| 亚洲mm色国产网站| 91国产高清在线| 精品国产一区二区三区久久久| 欧美一区二区精品在线| 色999日韩国产欧美一区二区| 国产精品成人网| aa级大片欧美| 黄色精品一二区| 亚洲免费中文| 伊人成综合网| 日韩88av| 妖精一区二区三区精品视频 | 欧美日韩在线视频观看| 亚洲欧洲成人自拍| 91久色porny| 成人精品一区二区三区四区 | 91精品91久久久久久| 日韩一区视频在线| 亚洲日本欧美中文幕| 亚洲二区中文字幕| 91麻豆精品国产91久久久久| 在线亚洲一区观看| 在线欧美日韩国产| 欧美日韩国产页| 精品国产1区2区| 亚洲 欧美综合在线网络| 国产精品国产三级国产普通话99| 久久网站最新地址| 国产亚洲成aⅴ人片在线观看 | 久久久久久无码精品大片| 中文字幕一区在线播放| 日韩大片免费在线观看| 日本网站在线播放| 日韩成人高清视频| 日韩免费av网站| 国产精品熟女视频| 中文字幕一区二区人妻| 一级α片免费看刺激高潮视频| 中文字幕在线播放日韩| 中文字幕欧美色图| 亚洲大尺度网站| 你懂得网站在线| www.中文字幕久久久| 久草免费在线| 波多野一区二区| 欧美freesex| 曰本一区二区| 中文在线观看免费| 日本天堂在线| 国语对白在线刺激| 成人在线视频中文字幕| aiai久久| 欧美激情不卡| 精品理论电影在线| 日韩成人免费在线| 国产精品午夜在线观看| 在线一区二区三区做爰视频网站| 亚洲国产欧美一区二区三区同亚洲 | 亚洲aa在线观看| 亚洲国产精品一区二区第一页 | 中文字幕在线欧美| 五月天福利视频| 欧美大电影免费观看| 欧美美乳视频| 麻豆国产精品视频| 亚洲黄色片在线观看| 亚洲成色777777在线观看影院| 97精品国产97久久久久久免费| 九色综合日本| 9久久婷婷国产综合精品性色| 91免费在线看片| 亚洲av无码国产精品永久一区| 国产污视频在线播放| 久久99蜜桃| 国产一区在线看| 黄网站色欧美视频| 日韩最新在线视频| 久久精品国产美女| 91性高潮久久久久久久| 性色av免费观看| 在线xxxx| 欧美疯狂party性派对| 99久久国产免费看| 欧美精品日日鲁夜夜添| 国内揄拍国内精品少妇国语| 亚洲免费在线精品一区| 少妇精品无码一区二区三区| 中文字幕自拍偷拍| 亚洲十八**毛片| 亚洲色图自拍| 亚洲AV无码成人精品区明星换面| 亚洲欧美激情另类| 精品国产三区在线| 黄色精品一二区| 欧美三级日本三级少妇99| 97免费中文视频在线观看| 97在线免费视频观看| 久久精品综合视频| 一二三四区在线| 色是在线视频| 围产精品久久久久久久| 成人网页在线观看| 色综合久久久久久久| 毛片精品免费在线观看| 久久国产精品一区二区三区| 粉色视频免费看| 麻豆精品久久久久久久99蜜桃| 在线网址91| 成人三级视频| 99久久99久久精品免费看蜜桃| 欧美丝袜丝nylons| 日本成人激情视频| 和岳每晚弄的高潮嗷嗷叫视频| 免费看91的网站| 黄色福利在线观看| 欧美一区一区| 免费成人av资源网| 色综合欧美在线视频区| 两个人的视频www国产精品| 奇米888一区二区三区| 久久久久国产精品区片区无码| a天堂中文在线观看| 亚洲图片小说区| 美国毛片一区二区三区| 欧美三级在线视频| 国产精品自拍视频| 国产精品一区二区三区久久久 | av黄色在线看| 91高清在线观看视频| 在线免费高清一区二区三区| 伊人色综合久久天天人手人婷| 欧美激情xxxx| 黄色一级视频片| 进去里视频在线观看| 九九99久久精品在免费线bt| eeuss国产一区二区三区| 亚洲乱码国产乱码精品精| 亚洲午夜精品久久| 日韩污视频在线观看| 日韩精品一区二区三区| 久久国产精品72免费观看| 精品无人国产偷自产在线| 伊人av成人| 欧美一区二区三区四| 精品一区二区三区四区五区| 2020国产精品自拍| 欧美高清videos高潮hd| 午夜精品在线免费观看| 色婷婷av一区二区三| 国产精品久久久久久| 欧美性xxxxxxxx| 欧美亚洲另类在线一区二区三区| 国产精品视频一区二区三| 成人18视频在线观看| 久久男人中文字幕资源站| 性日韩欧美在线视频| 超级砰砰砰97免费观看最新一期 | 欧美天堂亚洲电影院在线观看| 欧美天堂亚洲电影院在线播放| 欧美极品日韩| 久久青青草原亚洲av无码麻豆 | 白白色 亚洲乱淫| 在线视频亚洲欧美| 九九爱精品视频| 91成人在线免费| 久久91成人| 欧美日韩人人澡狠狠躁视频| 成人在线国产精品| 中文字幕网站在线观看| av资源一区| 福利91精品一区二区三区| 中文字幕av一区二区| 国产三级三级三级看三级| www天堂在线| 欧美艳星介绍134位艳星| 精品久久久久久久久久久久| 国产在线一区二区三区四区| 久草视频在线观| 最新国产精品视频| 欧美视频在线不卡| 自拍偷拍视频在线| 五月激情婷婷综合| 麻豆成人av在线| 欧美精品成人91久久久久久久| 亚洲天堂网一区二区| 小视频免费在线观看| 久久日韩精品一区二区五区| 国产69精品久久久久久| 成年人免费观看视频网站| 日韩色淫视频| 中文字幕一区日韩精品欧美| 国产成人av在线| 欧美a级片免费看| 国产黄色一区| 国产精品毛片大码女人| 成人一区二区电影| 久久免费小视频| 日韩大胆成人| 8x福利精品第一导航| 国产aaa免费视频| 黄色小视频在线观看| 奇米色777欧美一区二区| 久久精品成人欧美大片| 国产乱淫av麻豆国产免费| 色呦呦在线视频| 久久久久久久久久久黄色| 成人性生交大片免费看小说| 久久亚洲av午夜福利精品一区| 精品女人视频| 中文字幕国产一区| 色吧影院999| 想看黄色一级片| 69堂免费精品视频在线播放| 亚洲成人tv网| 国产免费一区二区视频| 午夜视频免费在线| 日韩av片子| 日韩经典一区二区三区| 欧美图片自拍偷拍| 91亚洲无吗| 亚洲国产精彩中文乱码av在线播放| 91蝌蚪视频在线| 久久九九精品视频| 日韩女优视频免费观看| 国产一级免费片| 免费成人网www| 日韩一区二区av| 欧美丰满熟妇bbbbbb| 你懂的网址国产 欧美| 欧美极品少妇xxxxx| 97免费在线观看视频| 石原莉奈在线亚洲三区| 91精品国产综合久久香蕉922| 国产熟女精品视频| 成人福利视频网站| 97在线免费观看| 中文字幕免费视频| 日韩在线网址| 国产精品99久久不卡二区| 欧美巨乳美女视频| 免费污网站在线观看| 嫩草伊人久久精品少妇av杨幂| 93久久精品日日躁夜夜躁欧美| 国产97在线亚洲| 国产精品精品软件男同| 日韩精品中文字幕一区二区| 午夜精品一区二区三区电影天堂| 欧美人与物videos另类| 亚洲香蕉在线视频| 99热国内精品永久免费观看| 精品久久久久久久久久久久久久久久久 | 9人人澡人人爽人人精品| 26uuu另类亚洲欧美日本老年| 九九九视频在线观看| 香蕉大人久久国产成人av| 在线免费观看日本欧美| 亚洲欧洲一区二区福利| 欧美另类自拍| 成人亚洲一区二区一| 国产精品爽黄69| 国产又粗又猛又爽| 日韩电影在线免费看| 97视频在线免费观看| 国产一区二区三区影院| 亚洲国产国产亚洲一二三| 国产不卡av在线免费观看| 成人av手机在线| 91丝袜高跟美女视频| 国产美女被下药99| 日本中文字幕在线观看视频| 欧美特黄一级|