精品欧美一区二区三区在线观看 _久久久久国色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| 日韩有码一区| 色综合久久综合| 亚洲 国产 日韩 综合一区| 97人妻精品一区二区三区动漫| 国产精品久久久久久久久妇女| 欧美一区二区三区日韩| 国产欧美日韩网站| 国产高清免费av在线| 国内久久精品视频| 2019精品视频| 顶级黑人搡bbw搡bbbb搡| 91精品入口| 欧美在线观看视频一区二区三区| 强伦女教师2:伦理在线观看| 日本人妻丰满熟妇久久久久久| 日精品一区二区| 不卡av电影在线观看| 久久久久麻豆v国产精华液好用吗| 色8久久影院午夜场| 一区二区三区自拍| 日韩欧美一区二区三区四区五区| www.xxx国产| 日韩二区在线观看| 欧美极品少妇全裸体| 一二三四在线观看视频| 色天下一区二区三区| 欧美久久久久久久久久| 国产精品-区区久久久狼| 97caopron在线视频| 国产三级欧美三级| 精品国产一区二区三区麻豆小说| 一本一道人人妻人人妻αv| 亚洲伦伦在线| 欧美大尺度在线观看| 中日韩精品一区二区三区| 欧美精品三级在线| 欧美日韩黄色一区二区| 欧美丰满熟妇bbbbbb百度| av在线免费观看网址| 国产日产欧产精品推荐色| 国产精品99久久久久久久| 国产一区二区在线视频观看| 日韩精品免费视频人成| 91精品国产电影| 久草福利资源在线观看| 91精品国产乱码久久久久久久| 亚洲日韩欧美视频| 一区二区不卡免费视频| heyzo欧美激情| 欧美一区二区福利视频| 激情黄色小视频| 日韩中文在线播放| 在线看一区二区| 999香蕉视频| 麻豆理论在线观看| 天天av天天翘天天综合网| 成年人视频网站免费| 国产精品久久久久久福利| 国产精品网站在线播放| 视频一区二区三区免费观看| 加勒比一区二区三区在线| 91香蕉国产在线观看软件| 精品久久蜜桃| 日韩av地址| 久久网站最新地址| 欧美一区二区三区电影在线观看| 日本啊v在线| 久久夜色精品国产欧美乱极品| 精品一区久久久久久| 日韩精品系列| 欧美国产视频在线| 亚洲一区二区四区| 麻豆tv入口在线看| 亚洲黄色尤物视频| 精品视频免费在线播放| 在线天堂新版最新版在线8| 日韩欧美在线视频观看| 欧美性猛交xxx乱久交| 日韩三区四区| 91精品久久久久久久久99蜜臂 | 国模吧视频一区| 欧美极品欧美精品欧美视频| 可以在线观看av的网站| 日本欧洲一区二区| 91在线高清视频| 人妻与黑人一区二区三区| 9久草视频在线视频精品| 欧美人与物videos另类| 欧美69xxx| 亚洲国产精品一区二区尤物区| 欧美综合在线播放| 亚洲不卡系列| 日韩美女主播在线视频一区二区三区| 五十路六十路七十路熟婆| 欧美精品系列| 欧美第一页在线| 国产精品国产三级国产专区52| 秋霞午夜鲁丝一区二区老狼| 亚洲综合色av| 日韩av资源| 亚洲天堂av一区| xxxx18hd亚洲hd捆绑| 成人在线视频观看| 亚洲国产福利在线| 成人三级视频在线观看| 亚洲欧洲另类| 国产欧美韩国高清| 偷拍精品一区二区三区| 亚洲人一二三区| 久久久噜噜噜www成人网| 亚洲男人在线| 亚洲欧美日韩精品久久| 欧美日韩一级在线观看| 日本vs亚洲vs韩国一区三区 | 国产午夜在线播放| 精品一区二区在线观看| 免费毛片一区二区三区久久久| 国产在线二区| 欧美午夜电影一区| 亚洲天堂av网站| 羞羞答答成人影院www| 人人做人人澡人人爽欧美| 草草视频在线播放| 国产精品久久久久一区| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 精品久久香蕉国产线看观看gif| 亚洲精品自拍网| 亚欧日韩另类中文欧美| 欧美日韩国产成人| 97人妻精品一区二区三区| 久久精品欧美日韩精品| 怡红院av亚洲一区二区三区h| 成人在线视频国产| 中文字幕亚洲情99在线| 丁香社区五月天| 91网上在线视频| 日韩五码在线观看| 亚洲电影一区| 久久国产天堂福利天堂| 一本一道精品欧美中文字幕| 欧美激情中文字幕一区二区| 日韩欧美亚洲天堂| 色天天色综合| 5566成人精品视频免费| 亚洲国产精彩视频| 亚洲精品福利视频网站| 天堂在线精品视频| 羞羞色午夜精品一区二区三区| 国产精品你懂得| 国产一二三在线观看| 色综合天天综合网国产成人综合天 | 日本wwwwwww| 欧美精品首页| 99影视tv| 91福利在线免费| 亚洲国产欧美精品| 成人在线免费看视频| 91年精品国产| 成人免费在线小视频| 最新精品国偷自产在线| 国产v综合ⅴ日韩v欧美大片| 蜜桃视频在线观看视频| 在线区一区二视频| 国产传媒视频在线 | 亚洲 自拍 另类 欧美 丝袜| 91精品综合| 91视频99| 国产不卡123| 亚洲欧美日韩在线高清直播| 国内av在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 手机免费av片| 午夜激情一区| 黄色91av| 日本精品网站| 欧美成人精品三级在线观看| 神马午夜在线观看| 在线一区二区三区| 亚洲视频导航| 日本中文字幕在线播放| 在线成人av网站| 麻豆天美蜜桃91| 国产91对白在线观看九色| 黄色成人在线看| 国产日产精品_国产精品毛片| 国产精品亚洲自拍| 性xxxxfjsxxxxx欧美| 日韩国产高清污视频在线观看| 欧美人一级淫片a免费播放| 国产精品久久久久久久久果冻传媒 | www..com国产| 亚洲我射av| 久久国产精品久久国产精品| 国产一级爱c视频| 亚洲第一二三区| 国产精品老牛影院在线观看| а√天堂在线官网| 日韩av在线一区二区| 中文字幕免费观看视频| 亚洲精品乱码久久久久久| 加勒比精品视频| 六月丁香综合在线视频| 国产v片免费观看| 97人人精品| 久久爱av电影| 国产精品高清一区二区| 91成人免费观看网站| 免费在线观看av片| 亚洲欧美三级在线| 亚洲精品国产精品国| 欧美亚洲图片小说| 日韩成人高清视频| 亚洲视频一区二区在线观看| 免费黄色在线视频| 粉嫩嫩av羞羞动漫久久久| 欧美成人黄色网址| 国产精品综合| 欧美日韩激情四射| 91视频综合| 日本黑人久久| 欧美高清视频看片在线观看| 亚洲自拍av在线| 国产精品久久久久77777丨| 97在线视频国产| 国产视频中文字幕在线观看| 一区二区三区视频免费在线观看| 少妇喷水在线观看| 在线电影欧美成精品| 久久影视中文字幕| 欧美午夜精品在线| 国产乱码久久久久久| 亚洲精品伦理在线| 91嫩草|国产丨精品入口| 亚洲国产精品av| 国产真实乱人偷精品人妻| 99久久精品一区| 国产原创剧情av| 成人精品gif动图一区| 日本黄色三级网站| 国产精品一区二区久久精品爱涩| 污片在线免费看| 视频在线观看一区二区三区| 99色精品视频| 国产欧美69| 久久综合九色综合88i| 1024日韩| 国产精品无码人妻一区二区在线| 狠狠噜噜久久| 无码熟妇人妻av在线电影| 亚洲无线视频| 欧美精品久久久久久久自慰| 亚洲麻豆一区| 日韩a∨精品日韩在线观看| 亚洲国产99| 欧洲精品一区二区三区久久| 国产欧美69| 黄色免费视频大全| 久久综合激情| 亚洲综合色在线观看| 精品系列免费在线观看| 亚洲一区二区三区四区精品| 国产一区二区按摩在线观看| 亚洲美女精品视频| 99re6这里只有精品视频在线观看| 国产老熟女伦老熟妇露脸| 久久免费看少妇高潮| 亚洲av无码一区二区三区人| 国产欧美一区二区精品婷婷| 长河落日免费高清观看| 亚洲免费视频中文字幕| 精品无码一区二区三区电影桃花| 午夜免费久久看| 欧美特黄aaaaaa| 欧美在线你懂的| 97人妻人人澡人人爽人人精品| 日韩欧美美女一区二区三区| 色婷婷av一区二区三区之红樱桃| 国产丝袜精品视频| 日本三级在线视频| 久久频这里精品99香蕉| 欧美羞羞视频| 91最新国产视频| 欧美变态网站| 亚洲成色www久久网站| 国产韩国精品一区二区三区| 欧美精品久久久久久久自慰| 日韩专区中文字幕一区二区| 在线播放黄色av| av日韩在线网站| 日本黄区免费视频观看| 亚洲一区精品在线| 毛片在线免费播放| 欧美mv日韩mv国产网站| 久久免费看视频| 欧美精品性视频| 高清不卡av| 91免费看片网站| 免费成人结看片| 国产成人免费高清视频| 久久国产福利| 三上悠亚 电影| 最新欧美精品一区二区三区| 午夜啪啪小视频| 不卡影院免费观看| 亚洲天堂精品一区| 亚洲va欧美va天堂v国产综合| 波多野结衣小视频| 精品国偷自产国产一区| 成人欧美亚洲| 久久免费精品视频| 伦一区二区三区中文字幕v亚洲| 国产精品一区视频| 亚洲网站在线免费观看| 亚洲国产第一页| 伦xxxx在线| 国产ts一区二区| xxxx日韩| 干日本少妇视频| 青草av.久久免费一区| 午夜免费福利影院| 亚洲人成亚洲人成在线观看图片| 无码任你躁久久久久久久| 精品国产露脸精彩对白| 99福利在线| 国产日韩欧美综合| 国产精品一区二区三区av麻| 欧美精品久久久久久久自慰 | 久久综合免费视频| 日韩高清不卡| 欧美亚洲免费高清在线观看 | www婷婷av久久久影片| 免费观看在线综合| 性欧美精品男男| 岛国精品视频在线播放| 狠狠综合久久av一区二区| 久久中文久久字幕| 免费成人高清在线视频| 亚洲韩国在线| 免费观看在线综合| 欧美xxxx精品| 欧美性色黄大片手机版| 成年网站在线| 国产精品久久久久91| 国产一区日韩| 欧美精品aaaa| 国产欧美日韩另类视频免费观看 | 91成人网在线| 国产大学生校花援交在线播放| 国产91热爆ts人妖在线| 亚洲瘦老头同性70tv| 日日摸天天爽天天爽视频| 91久色porny| aaaaaa毛片| 亚洲性视频网站| 黄色成人在线视频| 中文字幕一区二区三区四区五区六区 | 欧美激情视频一区二区三区| 亚洲欧美日韩一区在线观看| 素人fc2av清纯18岁| 色婷婷激情综合| 成年人视频在线免费观看| 国产免费一区二区三区在线观看| 欧美第一精品| av地址在线观看| 亚洲va欧美va国产va天堂影院| 亚洲av成人无码久久精品老人 | 久久这里有精品15一区二区三区| 色无极影院亚洲| 欧美亚日韩国产aⅴ精品中极品| 搞黄视频在线观看| 成人免费午夜电影| 欧美性久久久| 风间由美一二三区av片| 色综合久久中文综合久久97| 亚洲视频tv| 动漫一区二区在线| 香蕉国产精品偷在线观看不卡| 日本一级免费视频| 欧美一区二区三区性视频| a级片在线免费| 日本免费高清一区二区| 激情综合色播激情啊| 国产在线观看99| 亚洲欧美日韩中文在线制服| 综合久久伊人| 波多野结衣之无限发射| 欧美激情综合五月色丁香小说| www.97av.com| 日本一区二区在线免费播放| 欧美国产美女| 国产精品九九视频| 欧美午夜电影在线播放| 波多一区二区| 亚洲欧洲精品一区| 91亚洲精品一区二区乱码| 波多野结衣黄色| 欧美丰满少妇xxxx| 日本久久一二三四|