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

Go語言之程序符號重命名

開發 后端
Go程序源代碼中,關鍵字、接口、類型、常量、變量、方法、函數、字段、標簽(label)等等的名稱都可以稱為符號。

[[427663]]

Go程序源代碼中,關鍵字、接口、類型、常量、變量、方法、函數、字段、標簽(label)等等的名稱都可以稱為符號。

Go可執行程序中,符號表主要包含兩種類型的符號:

  1. 數據對象(Data object)
  2. 函數(Function)

一般情況下(不是絕對的),在源代碼編譯為可執行程序的過程中,

  • 關鍵字、局部變量、標簽會轉變為指令、數據或者消失,而不再是符號
  • 接口、類型、全局常量會被保存為不可變數據,而不再是符號
  • 函數、方法、全局變量、全局常量會被重命名,保存在符號表中

本文主要總結了函數、方法、全局變量在編譯過程中通用的重命名規則,不討論類似內聯優化、閉包、非空接口、編譯器生成等復雜的情況。

規則

Go 1.18版本之前符號重命名常見規則列表如下:

  1. 包名.變量名
  2. 包名.函數名
  3. 包名.函數名.funcN
  4. 包名.函數名.funcN.N
  5. 包名.類型.函數名
  6. 包名.類型.函數名.funcN
  7. 包名.類型.函數名.funcN.N
  8. 包名.(*類型).函數名
  9. 包名.(*類型).函數名.funcN
  10. 包名.(*類型).函數名.funcN.N
  11. 模塊名/包名.變量名
  12. 模塊名/包名.函數名
  13. 模塊名/包名.函數名.funcN
  14. 模塊名/包名.函數名.funcN.N
  15. 模塊名/包名.類型.函數名
  16. 模塊名/包名.類型.函數名.funcN
  17. 模塊名/包名.類型.函數名.funcN.N
  18. 模塊名/包名.(*類型).函數名
  19. 模塊名/包名.(*類型).函數名.funcN
  20. 模塊名/包名.(*類型).函數名.funcN.N
  21. 包名.init
  22. 包名.init.N
  23. 模塊名/包名.init
  24. 模塊名/包名.init.N

以上規則羅列過于詳細,主要是因為包含了過多的匿名函數命名規則;本文會縮小分類粒度進行歸納:

  1. 普通函數
  2. 匿名函數
  3. 方法
  4. 全局常量
  5. 模塊
  6. 初始化函數

環境

  1. OS : Ubuntu 20.04.2 LTS; x86_64 
  2. Go : go version go1.16.2 linux/amd64 

代碼清單

完整代碼已經上傳到 Github 倉庫:https://github.com/fooree/go-names

目錄和文件結構如下:

go.mod

  1. module github.com/fooree/go-names 
  2.  
  3. go 1.16 

main.go

  1. package main 
  2.  
  3. import ( 
  4.   "debug/elf" 
  5.   "fmt" 
  6.   "github.com/fooree/go-names/internal" 
  7.   "github.com/fooree/go-names/internal/foo" 
  8.   "github.com/fooree/go-names/internal/foo/ree" 
  9.   "os" 
  10.   "path/filepath" 
  11.   "reflect" 
  12.   "sort" 
  13.   "strings" 
  14.   "time" 
  15.  
  16. //go:noinline 
  17. func anonymousType() { 
  18.   t := reflect.TypeOf(struct { 
  19.     Name string 
  20.   }{ 
  21.     Name"Jack"
  22.   }) 
  23.   fmt.Printf("name=%s, string=%s, addres=%p\n", t.Name(), t.String(), t) 
  24.  
  25. func main() { 
  26.   anonymousType() 
  27.   ree.Run() 
  28.   foo.Y.Foo() 
  29.   internal.X.Foo() 
  30.    
  31.   name, _ := filepath.Abs(os.Args[0]) 
  32.   file, err := elf.Open(name
  33.   if err != nil { 
  34.     panic(err) 
  35.   } 
  36.   defer func() { _ = file.Close() }() 
  37.   symbols, err := file.Symbols() 
  38.   if err != nil { 
  39.     panic(err) 
  40.   } 
  41.  
  42.   slice := make([]string, 0, 100) 
  43.   for _, symbol := range symbols { 
  44.     const module = "github.com/fooree/go-names" 
  45.     const name = "main" 
  46.     if strings.HasPrefix(symbol.Name, module) || strings.HasPrefix(symbol.Namename) { 
  47.       slice = append(slice, symbol.Name
  48.     } 
  49.   } 
  50.  
  51.   go func() { 
  52.     sort.Slice(slice, func(i, j int) bool { 
  53.       return slice[i] < slice[j] 
  54.     }) 
  55.     go func() { 
  56.       fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
  57.     }() 
  58.   }() 
  59.  
  60.   time.Sleep(time.Second
  61.  
  62.   for _, sym := range slice { 
  63.     fmt.Println(sym) 
  64.   } 

internal/a.go

  1. package internal 
  2.  
  3. import ( 
  4.   "fmt" 
  5.   "reflect" 
  6.  
  7. type Foo interface { 
  8.   Foo() 
  9.  
  10. type Int int 
  11.  
  12. var X Int 
  13.  
  14. //go:noinline 
  15. func (i *Int) Foo() { 
  16.   t := reflect.TypeOf(i) 
  17.   go func() { 
  18.     fmt.Printf("i am Int, name=%s, string=%s\n", t.Name(), t.String()) 
  19.   }() 
  20.  
  21. func init() { 
  22.   X = Int(0x123) 
  23.  
  24. func init() { 
  25.   fmt.Println("X =", X) 

internal/foo/b.go

  1. package foo 
  2.  
  3. import ( 
  4.   "fmt" 
  5.   "reflect" 
  6.  
  7. type Ree struct { 
  8.   Name string 
  9.  
  10. //go:noinline 
  11. func (r Ree) Foo() { 
  12.   anonymousType() 
  13.   t := reflect.TypeOf(r) 
  14.   fmt.Printf("i am Ree, name=%s, string=%s\n", t.Name(), t.String()) 
  15.  
  16. //go:noinline 
  17. func anonymousType() { 
  18.   t := reflect.TypeOf(struct { 
  19.     Name string 
  20.   }{ 
  21.     Name"Jack"
  22.   }) 
  23.   fmt.Printf("name=%s, string=%s, addres=%p\n", t.Name(), t.String(), t) 
  24.  
  25. var Y = Ree{"Rose"
  26.  
  27. func init() { 
  28.   fmt.Println("Y =",Y) 

internal/foo/ree/c.go

  1. package ree 
  2.  
  3. import "sort" 
  4.  
  5. var arr = []int{1, 5, 6, 2, 7, 3, 7, 2} 
  6.  
  7. func Run() { 
  8.   sort.Slice(arr, func(i, j int) bool { 
  9.     return arr[i]<arr[j] 
  10.   }) 

查看符號表

編譯以上代碼并執行,在執行過程中,對可執行程序本身進行符號解析,過濾并輸出以上代碼中定義的符號。

普通函數

在Go語言中,所有的代碼都必須位于某個包(package)中。

在Go語言中,最特殊的一個包名是main,無論它所在的目錄名稱是什么,編譯后該包下的符號都必須以 main.開頭。

在Go語言中,最特殊的一個函數是main包中的main函數,其編譯之后的符號名稱為main.main,Go運行時將該函數作為程序的入口。

main包中的其它有名稱的函數,都會被編譯器重命名為“包名.函數名”的格式,例如main.anonymousType。

匿名函數

顧名思義,匿名函數就是沒有名稱的函數。

函數中定義的匿名函數,會被重命名為“包名.函數名.funcN”的格式,其中N是一個可遞增的數字。

例如,在以上代碼清單中,

main函數里defer關鍵字后的func() { _ = file.Close() }()是第一個匿名函數,被重命名為main.main.func1。

main函數里go關鍵字后的func是第二個匿名函數,被重命名為main.main.func2。

main.main.func2函數里又定義了兩個匿名函數,它們不再被重命名為funcN格式,而是被重命名為funcN.N格式,分別為main.main.func2.1和main.main.func2.2。

方法

專屬于某一個數據類型的函數,稱為方法。

方法,只不過是語法層面的一個稱謂而已,其本質就是函數;方法的接受者就是其第一個參數,所以方法至少有一個參數。

在 A Tour of Go (https://tour.golang.org/methods/1) 中,對函數的定義為:

  1. A method is a function with a special receiver argument. 

方法的定義格式有兩種:

1.接受者為數據類型

例如,reflect/value.go源文件中的Elem方法:

  1. func (v Value) Elem() Value { 
  2.     // 此處省略方法代碼 

2.接受者為指針類型

例如,reflect/value.go源文件中的Value方法:

  1. func (it *MapIter) Value() Value {  
  2.     // 此處省略方法代碼 

通常情況下,以上兩種格式的方法定義,對應的重命名規則分別如下:

包名.類型.方法名,例如:reflect.Value.Elem

包名.(*類型).方法名,例如:reflect.(*MapIter).Value

實際情況是:編譯過程中的方法重命名規則要復雜的多。后續其他的專題文章會逐漸介紹。

方法中如果包含匿名函數,重命名規則是在其后追加funcN或funcN.N。

全局變量

全局變量的重命名規則是“包名.變量名”。

例如os/proc.go源文件中定義的Args變量。

包層級

在Go語言中,一個包可以包含和定義其他的包,這是通過子目錄實現的,從而形成了包的層級結構。

如果包存在層級結構,則使用“/”進行包名之間的連接,從而實現包的編譯重命名。

例如,io/fs/源碼目錄中定義包名是fs,該包中的變量和函數,在編譯后它們的包名都是“io/fs”。

模塊

模塊(module)是Go語言的依賴管理工具。

一個模塊一般會包含一個或多個包(package)。

模塊中的包、函數、方法、全局變量、匿名函數的重命名規則與以上總結的規則一致,只是需要增加前綴“模塊名/”。

例如,文本代碼清單中定義的模塊名稱是github.com/fooree/go-names,模塊中定義的符號重命名如下:

  1. github.com/fooree/go-names/internal.(*Int).Foo        // 方法名 
  2. github.com/fooree/go-names/internal.(*Int).Foo.func1  // 匿名函數 
  3. github.com/fooree/go-names/internal.X                 // 全局變量 
  4. github.com/fooree/go-names/internal/foo.Ree.Foo       // 方法名 
  5. github.com/fooree/go-names/internal/foo.Y             // 全局變量 
  6. github.com/fooree/go-names/internal/foo.anonymousType // 函數名 
  7. github.com/fooree/go-names/internal/foo/ree.Run       // 函數名 
  8. github.com/fooree/go-names/internal/foo/ree.Run.func1 // 匿名函數 
  9. github.com/fooree/go-names/internal/foo/ree.arr       

初始化函數

關于初始化函數的重命名規則,請閱讀 【Go】初始化函數。

結語

本文總結了一些基本的符號重命名規則。

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

 

責任編輯:武曉燕 來源: Golang In Memory
相關推薦

2020-12-31 09:06:44

Go語言Reflect

2021-10-03 22:18:14

Go語言整數

2021-10-23 06:42:14

Go語言接口

2022-03-28 13:34:26

Go泛型部署泛型

2021-10-16 17:53:35

Go函數編程

2024-01-05 20:46:14

2010-11-19 13:48:18

2021-05-12 08:53:54

Go語言調度

2013-08-20 10:11:20

Go系統管理員

2021-10-18 10:53:26

Go 代碼技術

2024-09-04 08:02:12

2012-06-20 15:01:04

Web

2013-03-22 15:40:32

VS項目整體命名.NET

2011-03-04 09:48:21

PureFTPd

2009-12-22 15:28:51

Linux批量重命名文

2024-01-08 08:23:07

Go語言代碼

2012-08-07 09:29:09

程序員編程

2021-05-27 08:47:16

C語言C語言程序開發

2012-08-13 14:13:46

2018-08-01 15:10:02

GolangPython語言
點贊
收藏

51CTO技術棧公眾號

精品在线免费观看| 婷婷成人综合| 亚洲国产一区二区三区青草影视| 成人免费xxxxx在线观看| 欧美做爰啪啪xxxⅹ性| 欧美日韩视频免费看| 中文字幕视频一区二区三区久| 99在线免费观看视频| 欧美 日韩 精品| 欧美gvvideo网站| 欧美精品一区二区三区视频| 日本三区在线观看| 91中文在线| 972aa.com艺术欧美| 国产精品久久婷婷六月丁香| 欧美日韩一级大片| 亚洲区小说区图片区qvod按摩| 欧美美女网站色| 国产人妻777人伦精品hd| 在线播放毛片| 91丨porny丨国产| 91视频九色网站| 国产亚洲欧美日韩高清| 欧美国产综合| 在线观看成人黄色| 国产婷婷在线观看| 成人污版视频| 欧美性猛交xxxx| 真人做人试看60分钟免费| 青春草在线观看| 国产传媒欧美日韩成人| 国产精品美女主播| 日本一级黄色录像| 91精品99| 最新国产精品亚洲| 国产亚洲无码精品| 成人午夜网址| 欧美一区二区三区视频| 校园春色 亚洲色图| 91豆花视频在线播放| 亚洲欧美日韩一区二区| 先锋在线资源一区二区三区| 五月婷婷丁香花| 国产高清精品久久久久| 成人久久18免费网站图片| 无码一区二区三区| 性xx色xx综合久久久xx| 97精品国产97久久久久久免费| 日韩在线不卡av| 欧美日韩性在线观看| 亚洲国产精品成人av| 少妇性l交大片7724com| 欧美videos粗暴| 欧美色视频在线| 国产精品丝袜久久久久久消防器材| 91cn在线观看| 一区二区三区在线播放| dy888午夜| 黄色免费在线观看网站| 国产精品麻豆欧美日韩ww| 视频一区二区在线观看| 精品视频一二三| 久久久影视传媒| 欧美日韩亚洲一区二区三区四区| 四虎在线免费看| 久久综合九色欧美综合狠狠| 精品国产乱码久久久久久蜜柚| 色欲av伊人久久大香线蕉影院| 成人性生交大片免费| 国产精品亚洲综合| 亚洲色大成网站www| 久久综合色一综合色88| 欧美一区二区三区四区在线观看地址| 黄色毛片在线看| 国产三级久久久| 亚洲精品一区二区三区樱花 | 成人视屏免费看| 国产在线观看一区| 蜜桃视频在线观看网站| 日本一区二区三区四区在线视频| 午夜精品一区二区三区四区 | 91极品身材尤物theporn| 激情五月婷婷综合网| 99视频在线| 天堂a中文在线| 亚洲国产高清aⅴ视频| 少妇熟女一区二区| 激情影院在线| 色欧美88888久久久久久影院| 老熟妇仑乱视频一区二区| 黄色成人小视频| 日韩欧美的一区| 欧类av怡春院| 欧美三级美国一级| 欧美大胆a视频| 久久黄色精品视频| 久久精品噜噜噜成人av农村| 97人人澡人人爽| 青青草超碰在线| 成人欧美一区二区三区黑人麻豆| 91.com在线| 日韩一区二区三区在线免费观看| 欧美精品在线观看一区二区| 中文字幕乱码一区| 欧美呦呦网站| 欧美劲爆第一页| 国产黄色免费观看| 毛片基地黄久久久久久天堂| 不卡视频一区二区| 激情小说 在线视频| 亚洲理论在线观看| 激情六月丁香婷婷| 视频精品一区二区三区| 亚洲欧洲一区二区三区久久| 成人免费视频网站入口::| 亚洲一区国产一区| 91久久嫩草影院一区二区| 亚洲aⅴ在线观看| 亚洲天堂精品在线观看| 苍井空浴缸大战猛男120分钟| 精品一区二区三区中文字幕视频| 国产视频精品自拍| 久久97人妻无码一区二区三区| 久久免费黄色| 国产精品国产一区二区| 黄网页在线观看| 色综合天天综合给合国产| 一卡二卡三卡四卡五卡| 日韩精品一卡| 亚州欧美日韩中文视频| 国产色综合视频| 中文字幕成人av| 欧美日韩成人免费视频| 亚洲综合网站| 日韩中文字幕在线免费观看| www.色国产| av动漫一区二区| 亚洲乱码日产精品bd在线观看| 日本中文字幕一区二区| 亚洲美女av在线| 国产一级做a爱免费视频| 国产在线一区二区综合免费视频| 蜜桃网站成人| gay欧美网站| 日韩av在线播放资源| 国产无遮挡又黄又爽在线观看| 国产一区二区91| 黄瓜视频免费观看在线观看www| 欧美三区四区| 亚洲日本aⅴ片在线观看香蕉| 国产a∨精品一区二区三区仙踪林| 成人黄色网址在线观看| 亚洲精品久久久久久久蜜桃臀| 九九99久久精品在免费线bt| 久久影院资源网| 99精品视频免费看| 亚洲女同女同女同女同女同69| 三级一区二区三区| 综合精品久久| www 成人av com| 福利在线导航136| 亚洲第一精品夜夜躁人人爽| 日韩免费一二三区| aaa亚洲精品一二三区| 欧美成人免费在线观看视频| 日韩伦理一区二区三区| 欧美中文字幕在线视频| 国产在线一二三区| 欧美日韩高清一区二区| 久久国产精品国语对白| 国产精品18久久久| 无码人妻少妇伦在线电影| 久久激情av| 国产精品av在线| 在线免费av网站| 91精品国产综合久久久久久漫画| 2021亚洲天堂| 成人黄色网址在线观看| 欧美日韩在线中文| 成人激情开心网| 91精品网站| 蜜桃视频在线观看播放| 一道本无吗dⅴd在线播放一区| 影音先锋黄色网址| 一区二区三区在线观看动漫| 黄色免费看视频| 三级成人在线视频| 国产精品h视频| 成人在线视频中文字幕| 国产97免费视| 老司机99精品99| 亚洲国产精品久久久久秋霞不卡| 亚洲欧美另类在线视频| 成人欧美一区二区三区1314| 亚洲精品乱码久久久久久蜜桃图片| 久久国产精品久久w女人spa| 色爱区成人综合网| 爱爱精品视频| 国产精品日韩久久久久| 嫩草在线视频| 日韩精品一二三四区| 一区二区www| 精品日韩中文字幕| 精品一区二区6| 成人av在线电影| 伊人国产在线视频| 中文高清一区| 综合久久国产| 天天操综合520| 5g国产欧美日韩视频| 成人性生活av| 欧美激情影音先锋| 日本福利在线| 亚洲欧美中文日韩在线| 后入内射欧美99二区视频| 欧美亚洲图片小说| 久久午夜免费视频| 亚洲精品视频在线观看网站| 国产精品天天干| 99久久久免费精品国产一区二区| 在线视频观看一区二区| 丝袜美腿一区二区三区| 久久精品xxx| 91精品国产91久久久久久密臀| 欧美不卡在线一区二区三区| 91精品国产乱码久久久竹菊| 国产一区香蕉久久| 成人一区视频| 日韩av电影在线播放| 91福利在线尤物| 欧美人与性动交| a√资源在线| 亚洲女成人图区| 欧美一级视频免费| 欧美一级理论性理论a| 亚洲网站免费观看| 欧美优质美女网站| 国产女主播喷水视频在线观看| 亚洲午夜久久久久中文字幕久| 91视频青青草| 中文字幕亚洲精品在线观看| 人人爽人人爽人人片| 久久亚洲综合av| 久久丫精品国产亚洲av不卡| 成人国产在线观看| 婷婷五月精品中文字幕| 国产成人av影院| 午夜不卡福利视频| 久久se这里有精品| 欧美成年人视频在线观看| 人妖欧美一区二区| 蜜桃免费在线视频| 蜜臀av在线播放一区二区三区| 亚洲精品一二三四五区| 久久婷婷影院| 成年网站在线播放| 九九国产精品视频| 国产高清999| 国产传媒欧美日韩成人| 日本性生活一级片| 成人精品一区二区三区四区 | 韩国一区二区三区视频| 91九色视频在线| 精品一区二区三区四区五区| 成人国产一区二区| 日韩理论电影中文字幕| 秋霞久久久久久一区二区| 欧美亚洲国产精品久久| 亚洲一区三区电影在线观看| 999国产精品| 亚洲爆乳无码精品aaa片蜜桃| 伊人久久亚洲热| 国产免费黄色av| 日本不卡不码高清免费观看| 亚洲免费一级视频| 国产一区 二区 三区一级| 亚洲欧美综合视频| 久久精品日产第一区二区三区高清版| xxxx日本黄色| 亚洲欧美另类图片小说| 91蜜桃视频在线观看| 日本久久电影网| 亚洲中文一区二区三区| 欧美哺乳videos| 三级视频网站在线| 最新国产精品拍自在线播放| 亚洲www色| 欧美中在线观看| 欧美成a人片免费观看久久五月天| 92看片淫黄大片欧美看国产片| 动漫3d精品一区二区三区乱码| 欧美一区二区福利| 你懂的国产精品永久在线| jizzjizz国产精品喷水| 久久精品国产亚洲aⅴ| 无码人妻一区二区三区免费n鬼沢| 97久久精品人人爽人人爽蜜臀 | 一区二区国产视频| 日韩在线 中文字幕| 欧美一区日韩一区| 免费在线高清av| 久久91精品国产91久久久| 五月天av在线| 亚洲va久久久噜噜噜久久天堂| 欧美综合精品| 免费国产成人看片在线| 另类av一区二区| 精品人妻人人做人人爽夜夜爽| 国产亚洲欧美色| 国产一级在线免费观看| 欧美三级电影网| 深夜福利免费在线观看| 另类图片亚洲另类| 主播大秀视频在线观看一区二区| 超碰97人人人人人蜜桃| 日韩在线看片| 亚洲中文字幕无码中文字| 国产一区二区三区四区在线观看| 国产精品无码久久久久一区二区| 亚洲已满18点击进入久久| 中文字幕一区二区人妻| 亚洲精品自拍第一页| 99久久精品免费观看国产| 国产精品自拍小视频| 小说区图片区色综合区| 国产av熟女一区二区三区| 久久99久久精品| 永久免费毛片在线观看| 欧美日韩精品在线视频| 人妻91麻豆一区二区三区| 久久国产精品网站| 青草综合视频| 亚洲国产一区在线| 日本欧美在线观看| 成人黄色免费网址| 色老综合老女人久久久| 天堂a√在线| 欧美中文在线字幕| 免费av一区| 女性女同性aⅴ免费观女性恋| 99久久精品国产网站| 国产精品变态另类虐交| 精品国产乱码久久久久久夜甘婷婷 | 91手机视频在线| 极品少妇一区二区三区精品视频 | 国产91在线视频| 蜜桃国内精品久久久久软件9| 北条麻妃69av| 久久美女艺术照精彩视频福利播放| wwwwww国产| 亚洲欧美日韩精品久久亚洲区 | 欧美性xxxx在线播放| 五月婷婷伊人网| 欧美一区二区视频97| 香蕉国产成人午夜av影院| aa免费在线观看| 国产日韩精品一区二区三区 | 日韩激情在线观看| 1024手机在线观看你懂的| 欧美三级韩国三级日本一级| 一区二区三区视频在线观看视频| 国产精品色悠悠| 91亚洲一区| 中文字幕 欧美日韩| 综合久久久久综合| www.av网站| 欧美激情奇米色| 午夜精品影视国产一区在线麻豆| 欧美啪啪免费视频| 国产日韩av一区| 中文字幕网址在线| 亚洲女成人图区| 99久久er| 国产精品一区二区不卡视频| 一本色道精品久久一区二区三区 | 亚洲成av人片在线观看| 色欲av伊人久久大香线蕉影院| 欧美激情奇米色| 国产91精品对白在线播放| 久久久久免费精品| 亚洲色图另类专区| 成人av无码一区二区三区| 538国产精品视频一区二区| 你微笑时很美电视剧整集高清不卡| 亚洲色图38p| 成人免费一区二区三区视频| 天堂av资源在线| 国产精品极品美女在线观看免费 | 国产日本欧美在线| 国产乱子轮精品视频| 在线观看黄网站| 中文字幕日韩欧美精品在线观看| 日韩精品久久久久久久软件91| www插插插无码免费视频网站| 久久久久久久久伊人| 中文字幕日韩第一页| 国自在线精品视频| 欧美人与物videos另类xxxxx| 日韩精品在线播放视频| 精品国产91久久久|