gpt4 book ai didi

go - bytes.String() 与 bytes.Bytes() 在 Go 中

转载 作者:IT王子 更新时间:2023-10-29 02:25:28 28 4
gpt4 key购买 nike

考虑这样一个文本文件:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com