我有這樣的文字,我想投入字節片:創建與已知的文本字符串字節片,在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")
據我瞭解在運行時這將:
- 在內存中創建與值的字符串
- 創建一個字節的片
- 複製串入字節分片內容(如需要重新分配)
每個字符串值的我都可以轉換成其對應的ASCII碼和直接創建字節片:
b := []byte{84, 104, ... }
雖然這不是很可讀。
我明白這裏的例子有點瑣碎,大多數電腦可以在一瞬間完成,但我很好奇。編譯器解釋[]byte("blah")
並在編譯時將其轉換爲高效的字節片?如果字符串包含非ASCII字符,最好的解決方案會改變嗎?
這些轉換是你最內層計算循環的一部分嗎?這是分析中顯示的瓶頸嗎? GC是否因爲轉換而產生太多垃圾而變得緩慢?如果否:爲什麼要麻煩? – Volker 2014-09-05 22:38:55
「如果字符串包含非ASCII字符,最好的解決方案會改變嗎?」號碼來源是utf8;例如'for _,chr:= range str {...}'循環處理utf8;你的程序可能不需要做任何特殊的規定來處理utf-8。 – twotwotwo 2014-09-05 23:54:46
不要以爲它會「根據需要重新分配」,因爲它已經知道字符串中有多少個字節,所以它可以預先佔用足夠的內存。列出這些字節似乎是一個非常糟糕的主意(使您的源代碼變得醜陋),我不確定它甚至能夠以更小的效率執行;由於字節片段是可變的,所以字節可能仍然需要從恆定地址複製到堆內存。另外,正如Volker所說,在啓動時複製的任何納秒都不是什麼大問題。 – twotwotwo 2014-09-06 00:10:44