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

标签 go

考虑这样一个文本文件:

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/

相关文章:

inheritance - 处理 Go 中缺乏继承的最佳实践

c++ - 如何从 C++ DLL 回调 GO 方法

ssl - Go smtp.SendMail 的 X509 证书问题

go - 用可变参数创建谓词

google-app-engine - 从 google go 中重命名的类型进行转换

Golang嵌套类在函数内

go - golang 中的 http HandleFunc 参数

go - 无法使用 Homebrew 软件在 mac 上安装特定版本的 go

go - Group 没有实现 Data(FooMethod 方法有指针接收器)

oop - OOP 语言等静态成员变量