精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产精品va在线| 亚洲激情av在线| 国产欧美精品一区二区三区介绍| 永久免费看片直接| av日韩精品| 亚洲不卡一区二区三区| 日本黑人久久| 精品国自产拍在线观看| 中文在线不卡| 中文字幕久久久av一区| 丰满熟女人妻一区二区三区| 玖玖在线播放| 亚洲欧美一区二区在线观看| 精品亚洲一区二区三区四区五区高| 亚洲精品毛片一区二区三区| 欧美三级小说| 中文字幕久热精品在线视频| 麻豆免费在线观看视频| av成人在线看| 岛国av一区二区| 中文字幕av日韩精品| 日韩中文字幕观看| 麻豆成人免费电影| 国产成人97精品免费看片| 免费中文字幕在线观看| 欧美高清视频在线观看mv| 亚洲第一av网| 日韩久久久久久久久久久| 粉嫩一区二区三区| 亚洲成人动漫在线观看| 这里只有精品66| 福利在线视频导航| 国产99久久久国产精品| 国产精品入口福利| 秋霞精品一区二区三区| 亚洲一本视频| 九九热这里只有精品免费看| 特级西西人体高清大胆| 综合亚洲自拍| 亚洲精品国产免费| 国偷自产av一区二区三区麻豆| 看片一区二区| 欧美在线播放高清精品| 免费在线观看日韩视频| 97人人在线视频| 一区二区三区在线视频播放| 香蕉精品视频在线| eeuss影院www在线观看| 国产午夜精品久久| 奇米精品在线| 欧美拍拍视频| 久久久久久久综合狠狠综合| 免费一区二区三区| 神马午夜精品95| 国产福利91精品一区| 亚洲一区二区三区香蕉 | 亚洲成人精品| 日韩在线观看免费全| 国产无遮挡在线观看| 日韩一区二区在线免费| 中文字幕亚洲色图| 影音先锋男人资源在线观看| 日韩欧美午夜| 久久精品99久久久香蕉| 国产精品三区在线观看| 欧美精品九九| 欧美激情一级二级| 日韩特黄一级片| 先锋影音国产一区| 日韩免费视频在线观看| 免费在线观看av的网站| 蜜臀99久久精品久久久久久软件| 国产精品日韩在线| 国产精品伦理一区| 国产精品99久久久| 国产伦精品一区二区三区免| 天天综合永久入口| 久久精品视频在线免费观看| 色噜噜色狠狠狠狠狠综合色一| 最新电影电视剧在线观看免费观看| 国产精品乱人伦中文| 看一级黄色录像| 国内小视频在线看| 狠狠躁夜夜躁人人爽天天天天97| 日本老熟妇毛茸茸| 成人免费91| 亚洲第一页自拍| 久久中文字幕人妻| 日韩啪啪电影网| 九九热最新视频//这里只有精品| 国产精品久久久久久久妇| 日韩国产欧美三级| 96精品久久久久中文字幕| 狠狠躁日日躁夜夜躁av | 永久免费观看片现看| 欧美日韩91| 欧美一级片一区| 一级日韩一级欧美| av亚洲精华国产精华精| 午夜精品一区二区三区在线观看 | 97caocao| 波多野结衣一区二区三区 | 亚洲免费二区| 欧美一级大片视频| japanese国产| 国产欧美一区二区精品性色超碰| 色哟哟免费网站| 免费福利视频一区二区三区| 欧美一区二区三区喷汁尤物| 素人fc2av清纯18岁| 国产精品黑丝在线播放 | 午夜精品久久久久久久久久久久久蜜桃| 日本强好片久久久久久aaa| 91精品天堂| fc2在线中文字幕| 午夜激情一区二区| 亚洲欧美天堂在线| 国产精品中文字幕亚洲欧美| 久久久在线免费观看| 伊人精品一区二区三区| 99国产精品久久| 成人性做爰片免费视频| 国产亚洲一区二区手机在线观看| 日韩视频免费观看高清完整版 | 亚洲少妇最新在线视频| 国产精品亚洲二区在线观看 | 视频一区欧美精品| 国产亚洲精品美女久久久m| 成视频免费观看在线看| 欧美最猛性xxxxx直播| 亚洲最大的黄色网| 国产精品草草| 5566av亚洲| 九七电影韩国女主播在线观看| 91国产免费看| 老牛影视av老牛影视av| 福利视频在线看| 国产一区二区区别| 久久久久亚洲精品| 国产有码在线观看| 国产欧美一区二区精品仙草咪| 亚洲美免无码中文字幕在线 | 欧美xxx.com| 亚洲第一福利视频在线| 波多野结衣电影免费观看| 久久视频精品| 国产美女精品视频| av在线播放网站| 色噜噜狠狠色综合中国| 波多野结衣 在线| 国产日韩一区二区三区在线| 国产精选一区二区| heyzo在线播放| 精品少妇一区二区三区在线播放| 永久免费看黄网站| 精品一区二区三区免费播放| 在线观看国产一区| 91精品国产一区二区在线观看 | 在线观看91av| 最新一区二区三区| 国产精品一区二区久激情瑜伽| 日韩最新中文字幕| 亚洲视频三区| 久久久久久久亚洲精品| 人妻无码一区二区三区久久99| 亚洲成国产人片在线观看| 手机在线成人av| 国产日韩一区二区三区在线播放| 欧美不卡三区| 成人精品国产亚洲| 久久久国产精品一区| 精品人妻一区二区三区四区不卡 | 中文在线最新版地址| 亚洲精品一区二区久| 欧美视频xxxx| 亚洲人成7777| 亚洲久久久久久| 视频一区二区国产| 9999在线观看| 丁香五月缴情综合网| 88国产精品欧美一区二区三区| 国产精品一二三区视频| 欧美电影一区二区| 国产无码精品久久久| 久久青草欧美一区二区三区| 毛片一区二区三区四区| 久久影院100000精品| 99超碰麻豆| 欧美黑人粗大| 久久影院模特热| 凸凹人妻人人澡人人添| 欧美日韩一级片在线观看| 欧美日韩一级大片| 久久久久国产精品麻豆ai换脸| 日韩成人精品视频在线观看| 伊人精品在线| 一区二区三区四区不卡| 国产精品极品| 国产日韩欧美在线| 国产高清视频色在线www| 色悠悠久久88| 污视频在线免费| 欧美精选一区二区| 成年人免费高清视频| 中文字幕亚洲在| 添女人荫蒂视频| 久久99这里只有精品| 91视频 -- 69xx| 亚洲h色精品| 日本一区二区在线| 久久夜色电影| 91九色视频在线| 欧美香蕉视频| 国内外成人免费激情在线视频| 日本中文字幕视频在线| 精品剧情v国产在线观看在线| 波多野结衣一二区| 天天影视涩香欲综合网| 农村黄色一级片| 国产精品热久久久久夜色精品三区| xxxwww国产| 国产一区二区三区免费播放| 日韩av手机版| 亚洲综合国产激情另类一区| 国产视频在线观看网站| 忘忧草精品久久久久久久高清| 日本一区视频在线| 欧美一区 二区| 成人高清在线观看| 亚洲精品tv| 国产精品久久中文| av综合电影网站| 2019中文字幕在线| 国产啊啊啊视频在线观看| 久久综合久久八八| 欧美日本高清| 日韩有码片在线观看| 国产youjizz在线| 亚洲一区二区久久| 免费在线一级视频| 日韩精品视频免费在线观看| 蜜臀av在线观看| 欧美成人福利视频| 亚洲不卡免费视频| 日韩一级成人av| 99在线无码精品入口| 91精品国产综合久久久久久久 | 污污的视频在线观看| 俺去亚洲欧洲欧美日韩| 麻豆tv在线| 久久在线视频在线| 成人免费观看视频大全| 不卡毛片在线看| 在线视频中文字幕第一页| 久久国产精品亚洲| 在线免费观看的av| 欧美风情在线观看| 爱看av在线| 亚洲18私人小影院| 天堂√8在线中文| 日本高清视频精品| 三上悠亚国产精品一区二区三区| 日本欧美黄网站| 国产黄色一区| 成人性生交大片免费看小说 | 欧美一区二区女人| www.久久精品.com| 亚洲成成品网站| 日韩av视屏| 中文字幕精品一区二区精品| 麻豆网在线观看| 久久99精品久久久久久青青91| a毛片不卡免费看片| 欧美中文字幕视频| 国产精品亚洲成在人线| 成人综合国产精品| 福利在线一区| 日本精品一区二区| 欧美激情欧美| 激情五月婷婷六月| 性一交一乱一区二区洋洋av| 九九九在线观看视频| 国产伦精品一区二区三区免费| 91丝袜在线观看| 国产日韩欧美高清在线| 国产精品国产精品88| 天天影视涩香欲综合网| 亚洲网站免费观看| 精品国产91亚洲一区二区三区婷婷| 亚洲人成色777777精品音频| 色婷婷综合久久久久| 欧美xxx黑人xxx水蜜桃| 日本精品久久久久影院| 国产精区一区二区| 久草精品电影| 91亚洲一区| 男人的天堂狠狠干| 麻豆成人综合网| 在线精品一区二区三区| 中文字幕日韩一区| 依依成人综合网| 欧美一区二区啪啪| 福利在线观看| 欧美综合在线第二页| 久久久精品区| 相泽南亚洲一区二区在线播放| 国自产拍偷拍福利精品免费一| 91热这里只有精品| 99久久综合国产精品| 国内毛片毛片毛片毛片毛片| 欧美日韩亚洲国产一区| 精品人妻一区二区三区浪潮在线 | 国产精品亚洲欧美| 欧美一级片在线免费观看| 国产精品久久久久影院老司| 亚洲GV成人无码久久精品| 亚洲精品一区二区三区蜜桃下载| 免费在线看黄色| 国产精品久久久久久中文字| 日韩精品福利一区二区三区| 成人毛片100部免费看| 九色porny丨国产精品| 日本污视频网站| 色综合久久综合| 性高潮久久久久久久久久| 欧美老肥婆性猛交视频| 91成人在线网站| 一区二区三区四区五区精品| 石原莉奈在线亚洲二区| 性少妇bbw张开| 狠狠色狠狠色综合日日小说| 国产91绿帽单男绿奴| 九九精品视频在线观看| 成人噜噜噜噜| 亚洲欧洲日夜超级视频| 天堂va蜜桃一区二区三区| 亚洲精品久久一区二区三区777| 国产精品国产精品国产专区不蜜| 无码人妻丰满熟妇精品 | 热re99久久精品国产66热| 免费一二一二在线视频| 国产伦视频一区二区三区| 91超碰成人| 亚洲综合123| 中文字幕不卡在线观看| 亚洲日本韩国在线| 精品国产一区二区三区久久影院| 久操视频在线播放| 91理论片午午论夜理片久久| 大片网站久久| 黄色一级片免费的| 国产精品久久久久久亚洲伦 | 欧美日韩精品电影| 黄色在线视频观看网站| 国产成人亚洲综合| 日本久久成人网| 蜜臀av.com| 国产一区91精品张津瑜| 登山的目的在线| 欧美一级午夜免费电影| 久操视频在线| 国产精品美女xx| 亚洲天堂偷拍| 丰满人妻一区二区三区大胸| 亚洲视频一区二区免费在线观看 | 成人免费图片免费观看| 91免费看网站| 亚洲激情在线| 亚洲精品乱码久久久久久不卡| 欧美性生交xxxxx久久久| 欧美一区二区视频| 国产精品久久久久久超碰| 不卡中文一二三区| 中文字幕av专区| 亚洲综合无码一区二区| 噜噜噜久久,亚洲精品国产品| 欧美专区福利在线| 精品欧美久久| 善良的小姨在线| 亚洲已满18点击进入久久| 欧美一级视频免费| 欧美亚洲国产成人精品| 国产成人一二| 黄色免费网址大全| 亚洲色图在线视频| 天天插天天干天天操| 国产91精品最新在线播放| 亚洲成人av| 久久人妻一区二区| 欧美日韩mp4| 四虎影院观看视频在线观看| av一区二区三区在线观看| 亚洲精品极品| 野外性满足hd| 欧美高清www午色夜在线视频| 色呦呦网站在线观看| 欧美日韩视频在线一区二区观看视频| 免费观看久久久4p| www日韩精品| 在线观看日韩www视频免费|