2014-09-05 23 views
6

我有這樣的文字,我想投入字節片:創建與已知的文本字符串字節片,在Golang

s := "There are these two young fish swimming along and they happen to meet an older fish swimming the other way" 

如果我寫

b := []byte("There are these two young fish swimming along and they happen to meet an older fish swimming the other way") 

據我瞭解在運行時這將:

  1. 在內存中創建與值的字符串
  2. 創建一個字節的片
  3. 複製串入字節分片內容(如需要重新分配)

每個字符串值的我都可以轉換成其對應的ASCII碼和直接創建字節片:

b := []byte{84, 104, ... } 

雖然這不是很可讀。

我明白這裏的例子有點瑣碎,大多數電腦可以在一瞬間完成,但我很好奇。編譯器解釋[]byte("blah")並在編譯時將其轉換爲高效的字節片?如果字符串包含非ASCII字符,最好的解決方案會改變嗎?

+1

這些轉換是你最內層計算循環的一部分嗎?這是分析中顯示的瓶頸嗎? GC是否因爲轉換而產生太多垃圾而變得緩慢?如果否:爲什麼要麻煩? – Volker 2014-09-05 22:38:55

+0

「如果字符串包含非ASCII字符,最好的解決方案會改變嗎?」號碼來源是utf8;例如'for _,chr:= range str {...}'循環處理utf8;你的程序可能不需要做任何特殊的規定來處理utf-8。 – twotwotwo 2014-09-05 23:54:46

+1

不要以爲它會「根據需要重新分配」,因爲它已經知道字符串中有多少個字節,所以它可以預先佔用足夠的內存。列出這些字節似乎是一個非常糟糕的主意(使您的源代碼變得醜陋),我不確定它甚至能夠以更小的效率執行;由於字節片段是可變的,所以字節可能仍然需要從恆定地址複製到堆內存。另外,正如Volker所說,在啓動時複製的任何納秒都不是什麼大問題。 – twotwotwo 2014-09-06 00:10:44

回答

3

Go將可執行程序中的字符串嵌入爲字符串文字。它在運行時使用runtime.stringtoslicebyte函數將字符串文字轉換爲字節片段。

2

如果從一個常量字符串初始化一個[]byte變量,它看起來像編譯器足夠聰明,不會創建一箇中間字符串:相反,字節片的支持數組是直接從靜態數據初始化的,而不是構造一個字符串變量首先。

有一個數據副本,但這是構建一個可變類型時預期。

+0

引用您看到的內容(基於「它看起來像」)會有幫助這裏。 – seh 2017-03-31 16:40:51

+1

它是從檢查編譯器生成的彙編程序開始的。 – 2017-04-04 07:28:57