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

Go內存中的字符串操作

開發 前端
內存中的字符串類型 詳細描述了字符串在內存中的結構及其類型信息。本文主要研究字符串的各種操作(語法糖),在內存中實際的樣子。

[[423000]]

內存中的字符串類型詳細描述了字符串在內存中的結構及其類型信息。

本文主要研究字符串的各種操作(語法糖),在內存中實際的樣子。

環境

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

聲明

操作系統、處理器架構、Go版本不同,均有可能造成相同的源碼編譯后運行時的寄存器值、內存地址、數據結構不同。

本文僅保證學習過程中的分析數據在當前環境下的準確有效性。

操作類型

比較

  • 相等性比較
  • 不等性比較

連接(相加)

與[]byte的轉換

與[]byte的拷貝

代碼清單

  1. package main 
  2.  
  3. import ( 
  4.   "fmt" 
  5.  
  6. func main() { 
  7.   var array [20]byte 
  8.   var s = "copy hello world" 
  9.   string2slice(s) 
  10.   copyString(array[:], s) 
  11.   slice2string(array[:]) 
  12.   compare() 
  13.   concat() 
  14.  
  15. //go:noinline 
  16. func copyString(slice []byte, s string) { 
  17.   copy(slice, s) 
  18.   PrintSlice(slice) 
  19.  
  20. //go:noinline 
  21. func string2slice(s string) { 
  22.   PrintSlice([]byte(s)) 
  23.  
  24. //go:noinline 
  25. func slice2string(slice []byte) { 
  26.   PrintString(string(slice)) 
  27.  
  28. //go:noinline 
  29. func compare() { 
  30.   var h = "hello" 
  31.   var w = "world!" 
  32.   PrintBool(h > w) 
  33.   PrintBool(h < w) 
  34.   PrintBool(h >= w) 
  35.   PrintBool(h <= w) 
  36.   PrintBool(h != w) // PrintBool(true
  37.   PrintBool(h == w) // PrintBool(false
  38.   PrintBool(testEqual(h, w)) 
  39.   PrintBool(testNotEqual(h, w)) 
  40.  
  41. //go:noinline 
  42. func testEqual(h, w string) bool { 
  43.   return h == w 
  44.  
  45. //go:noinline 
  46. func testNotEqual(h, w string) bool { 
  47.   return h != w 
  48.  
  49. //go:noinline 
  50. func concat() { 
  51.   hello := "hello " 
  52.   world := "world" 
  53.   jack := "Jack" 
  54.   rose := " Rose " 
  55.   lucy := "Lucy" 
  56.   lily := " Lily " 
  57.   ex := "!" 
  58.   PrintString(concat2(hello, world)) 
  59.   PrintString(concat3(hello, jack, ex)) 
  60.   PrintString(concat4(hello, jack, rose, ex)) 
  61.   PrintString(concat5(hello, jack, rose, lucy, lily)) 
  62.   PrintString(concat6(hello, jack, rose, lucy, lily, ex)) 
  63.  
  64. //go:noinline 
  65. func concat2(a, b string) string { 
  66.   return a + b 
  67.  
  68. //go:noinline 
  69. func concat3(a, b, c string) string { 
  70.   return a + b + c 
  71.  
  72. //go:noinline 
  73. func concat4(a, b, c, d string) string { 
  74.   return a + b + c + d 
  75.  
  76. //go:noinline 
  77. func concat5(a, b, c, d, e string) string { 
  78.   return a + b + c + d + e 
  79.  
  80. //go:noinline 
  81. func concat6(a, b, c, d, e, f string) string { 
  82.   return a + b + c + d + e + f 
  83.  
  84. //go:noinline 
  85. func PrintBool(v bool) { 
  86.   fmt.Println("v =", v) 
  87.  
  88. //go:noinline 
  89. func PrintString(v string) { 
  90.   fmt.Println("s =", v) 
  91.  
  92. //go:noinline 
  93. func PrintSlice(s []byte) { 
  94.   fmt.Println("slice =", s) 
  • 添加go:noinline注解避免內聯,方便指令分析
  • 定義PrintBool/PrintSlice/PrintString函數避免編譯器插入runtime.convT*函數調用

深入內存

字符串轉[]byte

代碼清單中的string2slice函數代碼非常簡單,用于觀察[]byte(s)具體實現邏輯,編譯之后指令如下:

圖片

可以清晰地看到,我們在代碼中的[]byte(s),被Go編譯器替換為runtime.stringtoslicebyte函數調用。

runtime.stringtoslicebyte函數定義在runtime/string.go源碼文件中,Go編譯器傳遞給該函數的buf參數值為nil。

  1. func stringtoslicebyte(buf *tmpBuf, s string) []byte { 
  2.   var b []byte 
  3.   if buf != nil && len(s) <= len(buf) { 
  4.     *buf = tmpBuf{} 
  5.     b = buf[:len(s)] 
  6.   } else { 
  7.     b = rawbyteslice(len(s)) 
  8.   } 
  9.   copy(b, s) 
  10.   return b 

rawbyteslice函數的功能是申請一塊內存用于存儲拷貝后的數據。

[]byte轉字符串

代碼清單中的slice2string函數代碼非常簡單,用于觀察string(slice)具體實現邏輯,編譯之后指令如下:

可以清晰地看到,我們在代碼中的string(slice),被Go編譯器替換為runtime.slicebytetostring函數調用。

runtime.slicebytetostring函數定義在runtime/string.go源碼文件中,Go編譯器傳遞給該函數的buf參數值為nil。

拷貝字符串到[]byte

代碼清單中的copyString函數代碼非常簡單,用于觀察copy(slice, s)具體實現邏輯,編譯之后指令如下:

這個邏輯稍微復雜一點點,將以上指令再次翻譯為Go偽代碼如下:

  1. func copyString(slice reflect.SliceHeader, s reflect.StringHeader) { 
  2.     n := slice.Len 
  3.     if slice.Len > s.Len { 
  4.         n = s.Len 
  5.     } 
  6.     if slice.Data != s.Data { 
  7.         runtime.memmove(slice.Data, s.Data, n) 
  8.     } 
  9.     PrintSlice(*(*[]byte)(unsafe.Pointer(&slice))) 

可以看到,Go編譯器在copy(slice, s)這個簡單易用語法糖背后做了很多的工作。

經過比較,以上偽代碼與runtime/slice.go源碼文件中的slicecopy函數非常相似,但又不完全一致。

不等性比較

代碼清單中的compare函數測試了兩個字符串的各種比較操作。

查看該函數的指令,發現Go編譯器將以下四種比較操作全部轉換為runtime.cmpstring函數調用:

  • >
  • <
  • >=
  • <=

runtime.cmpstring函數是一個編譯器函數,不會被直接調用,聲明在cmd/compile/internal/gc/builtin/runtime.go源碼文件中,由匯編語言實現。

GOARCH=amd64的實現位于internal/bytealg/compare_amd64.s源碼文件中。

該函數返回值可能是:

然后使用cmp匯編指令將返回值與0進行比較,再使用以下匯編指令保存最終的比較結果(true / false):

在本例中,有兩個特殊的比較,分別被編譯為單條指令:

  • h != w 被編譯為 movb $0x1,(%rsp)
  • h == w 被編譯為 movb $0x0,(%rsp)

這是因為在本例中編譯器知道"hello"與"world"兩個字符串不相等,所以直接在編譯的時候直接把比較結果編譯到機器指令中。

所以,在代碼定義了testEqual和testNotEqual函數用于比較字符串變量。

相等性比較

關于相等性比較,在 內存中的字符串類型 中已經做了非常詳細的分析和說明。

在本文的代碼清單中,testEqual函數指令如下,與runtime.strequal函數一致,是因為編譯器將runtime.strequal函數內聯(inline)到了testEqual函數中。

出乎意料的是,!=與==編譯后的幾乎一致,只是兩處指令對結果進行了相反的操作:

字符串連接(相加)

在本文的代碼清單中,concat函數用于觀察字符串的連接(+)操作,測試結果表明:

  • 2個字符串相加,實際調用runtime.concatstring2函數
  • 3個字符串相加,實際調用runtime.concatstring3函數
  • 4個字符串相加,實際調用runtime.concatstring4函數
  • 5個字符串相加,實際調用runtime.concatstring5函數
  • 超過5個字符串相加,實際調用runtime.concatstrings函數

以上這些函數調用,都是Go編譯器的代碼生成和插入工作。

在插入runtime.concatstring*函數的過程中,編譯器傳遞給這些函數的buf參數的值為nil。

runtime.concatstring*函數的實現非常簡單,這里不再進一步贅述。

小結

從以上詳細的分析可以看到,我們在開發過程中,所有對字符串進行的簡單操作,都會被Go編譯器編碼為復雜的指令和函數調用。

許多開發者喜歡使用Go進行開發,理由是Go語言非常簡單、簡潔。

是的,我們都喜歡這種甜甜的語法糖。

而且,發掘語法糖背后的秘密,也是很好玩的事。

本文轉載自微信公眾號「Golang In Memory」

責任編輯:姜華 來源: Golang In Memory
相關推薦

2021-09-07 09:23:07

C++字符串算法

2010-09-06 17:30:46

SQL函數

2015-06-09 14:43:36

javascript操作字符串

2024-04-01 08:41:39

字符串.NET

2010-03-16 10:58:35

Python字符串

2009-11-27 10:24:25

PHP字符串操作

2009-07-15 17:20:45

Jython字符串

2021-03-08 08:57:00

Go 字符串測試

2024-10-30 16:49:00

Python字符串

2010-03-11 19:34:57

Python字符串

2010-06-28 15:18:51

SQL Server

2010-07-14 12:57:59

Perl字符串

2009-08-24 13:04:44

操作步驟C#字符串

2022-07-18 08:18:11

字符JavaJDK

2021-10-14 15:34:48

C語言字符串函數

2023-01-03 08:07:33

Go字符串指針

2023-12-11 07:33:05

Go語言字符技巧

2022-12-08 12:05:03

Bash字符串

2011-06-08 15:45:41

字符串JAVA

2009-02-24 15:39:27

字符串比較函數函數
點贊
收藏

51CTO技術棧公眾號

亚洲一区 视频| 天天干天天玩天天操| 日韩一级片免费观看| 老司机精品视频网站| 色诱女教师一区二区三区| 国产成人av免费观看| 蜜桃麻豆影像在线观看| 国产精品无人区| 国产免费一区二区三区| 国产精品成人久久久| 欧美日本国产| 永久免费毛片在线播放不卡| 又黄又色的网站| 亚洲a∨精品一区二区三区导航| 最新久久zyz资源站| 久久66热这里只有精品| 国产精品羞羞答答在线| 亚洲在线观看| 欧美黑人性猛交| 手机看片福利视频| 高清精品视频| 欧美精品粉嫩高潮一区二区| 狠狠干视频网站| 一级毛片视频在线| 91香蕉视频在线| 91一区二区三区| 伊人久久一区二区| 美女精品在线| 97视频在线观看亚洲| 午夜国产福利一区二区| 色婷婷色综合| 国产小视频91| 91成人破解版| 六月丁香久久丫| 欧美第一区第二区| 超碰中文字幕在线观看| 免费一级欧美在线观看视频| 91国产免费看| 欧美三级午夜理伦三级| 看黄在线观看| 午夜视频一区二区| 成人免费在线网| 亚洲综合影视| 1000精品久久久久久久久| 亚洲日本欧美在线| 成a人片在线观看www视频| 久久蜜桃av一区二区天堂 | 伊人再见免费在线观看高清版 | 91福利在线观看视频| 肉肉av福利一精品导航| 欧美一级片在线播放| 日韩字幕在线观看| 99国产精品久久久久久久| 国产+人+亚洲| 日本一级片免费看| 亚洲日本免费| 国产69精品久久久久久| 久草视频在线观| 国产精品入口| 国产成人鲁鲁免费视频a| 天天操夜夜操视频| 久久在线91| 国产精品老牛影院在线观看| 亚洲av综合一区| 蜜臀91精品一区二区三区| 国产精品一区二区三区在线播放 | 麻豆视频在线观看| 欧美在线高清| 欧美精品videossex88| 国产真实乱偷精品视频| 99精品视频网| 日本精品一区二区三区在线| 亚洲va欧美va人人爽| 日本一区二区三区在线视频 | 久久天天躁狠狠躁夜夜躁2014| 免费91在线观看| 欧美一区二区三区另类| 中日韩男男gay无套| 亚洲美女偷拍久久| 91网站在线观看免费| ririsao久久精品一区| 欧美日韩精品在线播放| 爱情岛论坛vip永久入口| 一区在线不卡| 日韩av综合网| 貂蝉被到爽流白浆在线观看 | 四虎4hu永久免费入口| aa级大片免费在线观看| 在线观看一区二区视频| 国产美女视频免费看| 国产精品丝袜在线播放| 亚洲午夜未删减在线观看 | 麻豆tv入口在线看| 亚洲成av人影院在线观看网| 日韩手机在线观看视频| 日本一区二区三区播放| 亚洲美女黄色片| 夫妻性生活毛片| 国产欧美大片| 亚洲精品免费一区二区三区| 视频一区二区在线播放| 亚洲欧美日韩久久精品| 国产91在线视频观看| 99re8精品视频在线观看| 亚洲精品wwwww| 成人精品一二三区| 午夜在线精品| 99re在线国产| 天天综合视频在线观看| 黄网动漫久久久| 久久久精品人妻一区二区三区| 精品国产一区一区二区三亚瑟 | 少妇精品视频一区二区免费看| 日韩欧美视频在线| 国产精品免费在线视频| 乱码第一页成人| 国产精品久久九九| 黄色av电影在线观看| 在线精品亚洲一区二区不卡| 久久久久国产精品区片区无码| 一本到12不卡视频在线dvd| 国产精品成人久久久久| 天天操天天干天天| 亚洲国产综合视频在线观看| 久久成年人网站| 久久在线免费| 国产精品美女主播| 成人在线免费看| 欧美体内谢she精2性欧美| 久草免费资源站| 欧美精品国产一区| 亚洲最大成人免费视频| 日本黄色片在线观看| 在线观看不卡视频| 无码一区二区三区在线| 性一交一乱一区二区洋洋av| 狠狠久久综合婷婷不卡| 波多野结衣中文在线| 欧美大片国产精品| 欧美日韩大片在线观看| 国产乱码字幕精品高清av | 一本综合精品| 国产综合欧美在线看| 超清av在线| 亚洲а∨天堂久久精品9966| 国产中文字字幕乱码无限| 国产盗摄女厕一区二区三区 | 国产熟妇久久777777| 在线综合亚洲| 麻豆91蜜桃| 日韩成人亚洲| 最近2019年中文视频免费在线观看 | 日韩毛片久久久| 欧美狂野另类xxxxoooo| 美国一级片在线观看| 精品一区二区在线播放| 日韩国产精品毛片| 亚洲一区二区三区四区电影| 久久久久久久影院| 丝袜+亚洲+另类+欧美+变态| 色哟哟在线观看一区二区三区| 黑人巨大精品欧美| 青青草原综合久久大伊人精品优势 | 一区二区不卡在线播放| 99久久久无码国产精品性波多| 亚洲激情婷婷| 日本一区二区三区四区在线观看| 九九九精品视频| 免费91在线视频| 四虎精品在线| 7777精品伊人久久久大香线蕉超级流畅 | 精品99又大又爽又硬少妇毛片 | 最新国产黄色网址| 国产综合欧美| 国产专区一区二区三区| 激情亚洲影院在线观看| 久久久国产精彩视频美女艺术照福利 | 国产桃色电影在线播放| 亚洲美女激情视频| 国产普通话bbwbbwbbw| 亚洲午夜免费福利视频| 国产精品无码久久久久一区二区| 另类的小说在线视频另类成人小视频在线 | 欧美日韩免费做爰大片| 欧美高清视频一二三区| 日韩少妇裸体做爰视频| 国产精品全国免费观看高清| 潘金莲一级淫片aaaaaaa| 免费亚洲网站| 手机福利在线视频| 色天下一区二区三区| 成人黄色免费片| 欧美激情网站| 久久久精品国产| 麻豆导航在线观看| 日韩精品自拍偷拍| 中文字幕欧美人妻精品一区蜜臀| 一区二区欧美国产| 国产真人真事毛片视频| 成人av在线看| 亚洲色图偷拍视频| 久久一本综合频道| 毛片在线播放视频| 国产精品久久久久久| 欧美成熟毛茸茸复古| 欧美大片91| 国产精品一二三视频| 中文在线аv在线| 欧美大片第1页| 在线免费看黄| 亚洲男女性事视频| 国产91免费看| 日韩欧美一级片| 国产又色又爽又黄又免费| 欧美视频精品一区| 久热精品在线观看| 亚洲欧美色一区| 纪美影视在线观看电视版使用方法| 成人18视频在线播放| 天天av天天操| 久久激情综合网| 久久久久免费精品| 亚洲欧美日韩精品一区二区 | 免费在线观看不卡| 精品www久久久久奶水| 亚洲国产美女| 免费在线黄网站| 夜间精品视频| 国风产精品一区二区| 外国成人激情视频| 一本久道久久综合狠狠爱亚洲精品 | 欧美一区二区三区影视| 亚洲一级视频在线观看| 欧美亚洲国产怡红院影院| 中文字幕69页| 欧美日韩国产在线看| 国产做受高潮漫动| 午夜精品久久久久久久久| 久久久久黄色片| 亚洲一卡二卡三卡四卡无卡久久| 国产一区二区三区在线视频观看| 中文字幕视频一区| 日韩欧美综合视频| 亚洲摸摸操操av| 欧美三级小视频| 亚洲黄色录像片| 欧美精品99久久久| 午夜精品福利一区二区三区av| 欧美日韩中文视频| 午夜精品一区二区三区免费视频| 丰满少妇乱子伦精品看片| 五月婷婷综合激情| 亚洲日本韩国在线| 欧美综合久久久| 亚洲图片小说视频| 欧美一区二区三区性视频| 国产成人毛毛毛片| 亚洲丁香久久久| 国产中文在线观看| xxx欧美精品| 五月婷婷视频在线观看| 欧美精品www在线观看| 国产精品电影| 国产成人综合精品| 一区二区三区| 国产亚洲福利社区| 国产乱码精品一区二区三区四区| 亚洲黄色一区二区三区| 亚洲欧美亚洲| 国产成人在线免费看| 奇米777欧美一区二区| 99国产精品久久久久久| 国产91综合一区在线观看| 波多野结衣视频播放| 国产亚洲女人久久久久毛片| sm捆绑调教视频| 亚洲国产欧美日韩另类综合| 午夜影院免费在线观看| 欧美日韩不卡视频| 欧美 日韩 国产 精品| 亚洲欧美日韩精品久久奇米色影视| 在线观看麻豆蜜桃| 久久久久久成人精品| 久久91导航| 不卡一区二区三区视频| 你微笑时很美电视剧整集高清不卡| 自拍偷拍亚洲色图欧美| 亚洲视频成人| 中文字幕色网站| 久久综合九色欧美综合狠狠| 国产又黄又粗又猛又爽的| 一区二区三区中文在线观看| 亚洲不卡在线视频| 精品久久久久av影院| www.亚洲视频| 午夜欧美不卡精品aaaaa| 日韩成人一区| 久久伊人一区二区| 一级欧洲+日本+国产| 国产精品69页| 成人午夜激情影院| 免费成人深夜夜行网站| 日韩人在线观看| 亚洲奶汁xxxx哺乳期| 最近2019年手机中文字幕| 碰碰在线视频| 亚洲综合在线小说| 久久免费精品视频在这里| 免费 成 人 黄 色| 国产成人免费在线视频| 懂色av粉嫩av浪潮av| 色综合天天视频在线观看 | 国产一区二区日韩精品欧美精品| 免费污视频在线观看| 国产拍精品一二三| 精品国产乱码久久久久久蜜坠欲下 | 99精品99久久久久久宅男| 欧美军人男男激情gay| 国模无码视频一区二区三区| 国产精品一区二区三区网站| 人成免费在线视频| 色乱码一区二区三区88| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 国产精品视频xxxx| 国产精品美女久久久久久不卡| 国产日韩欧美精品在线观看| 国产乱码精品一品二品| 狂野欧美性猛交| 欧洲av一区二区嗯嗯嗯啊| 猫咪在线永久网站| 国产成人精品视频在线| 亚瑟一区二区三区四区| 免费看的黄色大片| 不卡一区二区三区四区| 国产午夜精品无码| 精品久久人人做人人爱| 性欧美ⅴideo另类hd| 成人黄色在线免费| 图片小说视频色综合| 免费网站在线观看黄| 日韩一区欧美小说| 国产又大又黑又粗| 久久精品在线视频| 日本伊人久久| 国产精品久久久久久久久电影网| 国产东北露脸精品视频| 国产一级久久久| 欧美精品一区二区久久婷婷| 91www在线| 欧美一区1区三区3区公司 | 综合久久精品| 国产精品欧美性爱| 午夜免费久久看| 无码国产伦一区二区三区视频| 7777免费精品视频| 伊人久久综合影院| 国产九九在线视频| 国产精品久久二区二区| 国产模特av私拍大尺度| 欧美日韩高清区| 秋霞影视一区二区三区| 女人另类性混交zo| 综合电影一区二区三区| 性做久久久久久久久久| 91国产视频在线播放| 国产精品密蕾丝视频下载| 欧美日韩一区二区三区69堂| 亚洲欧洲精品天堂一级| 丰满少妇一级片| 欧美孕妇性xx| 999久久久91| av漫画在线观看| 在线观看亚洲专区| 1区2区3区在线视频| 欧美另类网站| 极品美女销魂一区二区三区免费| 国产亚洲成人精品| 亚洲色图25p| 免费精品一区| 精品视频一区二区在线| 亚洲视频在线观看三级| 午夜在线视频免费| 国产精品自在线| 亚洲国产日本| 日本美女bbw| 欧美videossexotv100| 欧洲一级精品| 91免费国产精品| 国产欧美日韩中文久久| 国产aⅴ爽av久久久久成人| 日本伊人精品一区二区三区介绍 | 国产欧美视频在线观看| www五月婷婷| 国产精品免费看久久久香蕉| 国产综合精品一区| 少妇太紧太爽又黄又硬又爽小说| 精品精品欲导航| 日韩五码电影| 国产精品亚洲a| 香蕉成人啪国产精品视频综合网 |