我使用二維字節(jié)切片來表示一堆行,但是當(dāng)我附加到其中一行時,我得到了一些非常奇怪的行為。這是一個例子:package mainimport ( "bytes" "fmt")func main() { str := []byte("first line\nsecond line\nthird line") values := bytes.Split(str, []byte("\n")) fmt.Println("Before:") fmt.Println(string(values[0])) fmt.Println(string(values[1])) fmt.Println(string(values[2])) fmt.Println() values[0] = append(values[0], []byte("-inserted text-")...) fmt.Println("After:") fmt.Println(string(values[0])) fmt.Println(string(values[1])) fmt.Println(string(values[2]))}我希望這個程序的輸出是Before:first linesecond linethird lineAfter:first line-inserted text-second linethird line但相反的輸出是:Before:first linesecond linethird lineAfter:first line-inserted text-inserted tet-ird linehttps://play.golang.org/p/iNw6s1S66U為什么會發(fā)生這種情況,我該如何解決?有趣的是,如果我不使用 split 而是定義如下值,則不會發(fā)生這種情況:values := [][]byte{[]byte("first line"), []byte("second line"), []byte("third line")}https://play.golang.org/p/pEflrhKLd4
2 回答

SMILET
TA貢獻1796條經(jīng)驗 獲得超4個贊
底層存儲是共享的,因此要獲得所需的效果,您需要存儲從 返回的切片的副本bytes.Split
,而不僅僅是返回的切片。當(dāng)您附加到返回的第一個切片時,您實際上是在踩到后面的切片。

慕斯709654
TA貢獻1840條經(jīng)驗 獲得超5個贊
您正在做的是附加到字符串,而不是附加到數(shù)組,這會溢出切片的底層數(shù)據(jù)結(jié)構(gòu)。這就是為什么數(shù)組的其余部分被您附加的字符串覆蓋的原因。
澄清(可能并非總是如此):
該數(shù)組values
由連續(xù)排列的 3 個 []byte 塊組成。每個 []byte 塊都有固定的長度(基于其中字符串的長度)。所以values[0]
長度為 10(不包括 '\n' 或 '\0')?,F(xiàn)在,如果您嘗試附加"-inserted text-"
到該塊,字符將“流入”到連續(xù)塊中values[1]
, 用 中的字符替換values[1]
其中的字符"-inserted text-"
。這就是為什么您會在values[1]
和 中看到這些字符的一部分values[1]
。
- 2 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消