考虑这样一个文本文件:Some texthere.---More textanother line.---Third part of text.我想把它分成三部分,用分隔---符分开。零件应存储在地图中。现在,具有不同类型的完全相同的程序。当我使用时string,一切正常:KEY: 0Some texthere.KEY: 1More textanother line.KEY: 2Third part of text.https://play.golang.org/p/IcGdoUNcTEe当我使用时[]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条经验 获得超5个赞
在字符串版本中,
parts[i] = buf.String()
parts[i]每次都设置为一个新字符串。在[]byte版本中,
parts[i] = buf.Bytes()
每次都设置parts[i]为由相同数组支持的字节切片。后备数组的内容对于所有三个切片都是相同的,但长度与创建时的长度匹配,这就是为什么所有三个切片显示相同的内容但在不同的地方截断的原因。
您可以替换字节切片行
parts[i] = buf.Bytes()
像这样:
bb := buf.Bytes()
b := make([]byte, len(bb))
copy(b, bb)
parts[i] = b
为了获得与字符串版本匹配的行为。但是字符串版本更容易,也更符合您似乎想要做的事情。
- 2 回答
- 0 关注
- 100 浏览
添加回答
举报
0/150
提交
取消