考虑这样一个文本文件:
Some text
here.
---
More text
another line.
---
Third part of text.
我想把它分成三部分,用---
分隔符分开。这些部分应存储在 map 中。
现在,不同类型的完全相同的程序。
当我使用 string
时,一切正常:
KEY: 0
Some text
here.
KEY: 1
More text
another line.
KEY: 2
Third part of text.
https://play.golang.org/p/IcGdoUNcTEe
当我使用 []byte
时,事情变得一团糟:
KEY: 0
Third part of teKEY: 1
Third part of text.
ne.
KEY: 2
Third part of text.
https://play.golang.org/p/jqLhCrqsvOs
为什么?
程序 1(字符串
):
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
}
最佳答案
在字符串版本中,
parts[i] = buf.String()
每次都将 parts[i]
设置为一个新字符串。在[]byte
版本中,
parts[i] = buf.Bytes()
每次都将 parts[i]
设置为由相同数组支持的字节 slice 。所有三个 slice 的支持数组的内容都相同,但长度与创建时的长度匹配,这就是为什么所有三个 slice 显示相同的内容但在不同的地方截断的原因。
你可以替换字节 slice 行
parts[i] = buf.Bytes()
像这样:
bb := buf.Bytes()
b := make([]byte, len(bb))
copy(b, bb)
parts[i] = b
为了获得匹配字符串版本的行为。但是字符串版本更容易,也更符合您似乎想要做的事情。
关于go - bytes.String() 与 bytes.Bytes() 在 Go 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51975902/