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

考虑这样一个文本文件:


Some text

here.

---

More text

another line.

---

Third part of text.

我想把它分成三部分,用分隔---符分开。零件应存储在地图中。


现在,具有不同类型的完全相同的程序。


当我使用时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 ( 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

}


慕容708150
浏览 101回答 2
2回答

慕工程0101907

在字符串版本中,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为了获得与字符串版本匹配的行为。但是字符串版本更容易,也更符合您似乎想要做的事情。

喵喵时光机

区别在于bytes.Buffer.String复制内存,而bytes.Buffer.Bytes不会。引用文档,该切片仅在下一次缓冲区修改之前有效(即,仅在下一次调用 Read、Write、Reset 或 Truncate 等方法之前)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go