在go裡面,string和slice的互換是需要進行記憶體拷貝的,雖然在底層,它們都只是用 pointer + len來表示的一段記憶體。
通常,我們不會在意string和slice的轉換帶來的記憶體拷貝效能問題,但是總有些地方需要關注的,剛好在看vitess**的時候,發現了一種很hack的做法,string和slice的轉換只需要拷貝底層的指標,而不是記憶體拷貝。當然這樣做的風險各位就要好好擔當了:
func string(b byte) (s string)
func slice(s string) (b byte)
在我的測試例子中,slice轉string之後,如果slice的值有變化,string也會跟著改變,如下:
b := byte("hello world")
a := string(b)
b[0] = 'a'
println(a) //output aello world
但是string轉slice之後,就不能更改slice了,如下:
a := "hello world"
b := slice(a)
b[0] = 'a' //這裡就等著崩潰吧
//但是可以這樣,因為go又重新給b分配了記憶體
上面為什麼會崩潰我猜想可能是string是immutable的,可能對應的記憶體位址也是不允許改動的。
另外,上面這個崩潰在defer裡面是recover不回來的,真的就崩潰了,原因可能就跟c的非法記憶體訪問一樣,os不跟你玩了。
go語言 slice和string的聯絡
str hello atguigu 使用切片獲取到 atguigu slice str 6 fmt.println slice slice 如果需要修改字串,可以看下面 使用型別轉換 將string轉換為byte切片 修改字串後 再講byte切片轉換為string arr1 byte str arr...
go語言 slice 迭代slice
go語言內建乙個關鍵字range用於迭代集合,當然他也可以迭代slice,也可以使用 來忽略我們不關心的元素,但是如果只關心index則不需這麼寫 for index,range slice1。下在給出完整 package main import fmt func main for index,va...
理解Go中的slice
最近閒來無事,深入研究了slice在golang中的實現並簡要閱讀了其相關的底層實現 後,對於實際工作中的一些slice相關 的寫法與bug有了一種豁然開朗的感覺。故記錄下來,與君分享。陣列 vs 切片 對於初學者來說,我們必須分清楚陣列與切片的區別。在go中,陣列與其他語言並無太大區別,都是一段指...