为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容708150 2023-03-21 17:24:04
考虑这样一个文本文件: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

为了获得与字符串版本匹配的行为。但是字符串版本更容易,也更符合您似乎想要做的事情。


查看完整回答
反对 回复 2023-03-21
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

区别在于bytes.Buffer.String复制内存,而bytes.Buffer.Bytes不会。引用文档

该切片仅在下一次缓冲区修改之前有效(即,仅在下一次调用 Read、Write、Reset 或 Truncate 等方法之前)。


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信