考慮這樣一個文本文件:Some texthere.---More textanother line.---Third part of text.我想把它分成三部分,用分隔---符分開。零件應(yīng)存儲在地圖中?,F(xiàn)在,具有不同類型的完全相同的程序。當(dāng)我使用時string,一切正常:KEY: 0Some texthere.KEY: 1More textanother line.KEY: 2Third part of text.https://play.golang.org/p/IcGdoUNcTEe當(dāng)我使用時[]byte,事情變得一團糟:KEY: 0Third part of teKEY: 1Third part of text.ne.KEY: 2Third part of text.https://play.golang.org/p/jqLhCrqsvOs為什么?計劃 1 ( string):func main() { parts := parseParts([]byte(input)) for k, v := range parts { fmt.Printf("KEY: %d\n%s", k, v) }}func parseParts(input []byte) map[int]string { parts := map[int]string{} s := bufio.NewScanner(bytes.NewReader(input)) buf := bytes.Buffer{} i := 0 for s.Scan() { if s.Text() == "---" { parts[i] = buf.String() buf.Reset() i++ continue } buf.Write(s.Bytes()) buf.WriteString("\n") } parts[i] = buf.String() return parts}計劃 2 ( []byte):func main() { parts := parseParts([]byte(input)) for k, v := range parts { fmt.Printf("KEY: %d\n%s", k, v) }}func parseParts(input []byte) map[int]string { parts := map[int]string{} s := bufio.NewScanner(bytes.NewReader(input)) buf := bytes.Buffer{} i := 0 for s.Scan() { if s.Text() == "---" { parts[i] = buf.String() buf.Reset() i++ continue } buf.Write(s.Bytes()) buf.WriteString("\n") } parts[i] = buf.String() return parts}
2 回答

慕工程0101907
TA貢獻1887條經(jīng)驗 獲得超5個贊
在字符串版本中,
parts[i] = buf.String()
parts[i]每次都設(shè)置為一個新字符串。在[]byte版本中,
parts[i] = buf.Bytes()
每次都設(shè)置parts[i]為由相同數(shù)組支持的字節(jié)切片。后備數(shù)組的內(nèi)容對于所有三個切片都是相同的,但長度與創(chuàng)建時的長度匹配,這就是為什么所有三個切片顯示相同的內(nèi)容但在不同的地方截斷的原因。
您可以替換字節(jié)切片行
parts[i] = buf.Bytes()
像這樣:
bb := buf.Bytes()
b := make([]byte, len(bb))
copy(b, bb)
parts[i] = b
為了獲得與字符串版本匹配的行為。但是字符串版本更容易,也更符合您似乎想要做的事情。
- 2 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報
0/150
提交
取消