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

struct 到 bytes.Buffer{} 之后的清理缓冲区

struct 到 bytes.Buffer{} 之后的清理缓冲区

Go
慕村225694 2022-10-24 15:47:07
我正在使用以下内容来保存结构 - 在很短的时间内很多(数据库读取和写入)。我需要清除缓冲区还是在垃圾收集后立即清除它?还是应该使用buffer.Reset()func ToBytes(p interface{}) []byte {    buf := bytes.Buffer{}    enc := gob.NewEncoder(&buf)    err := enc.Encode(p)    if err != nil {        log.Fatal(err)    }    fmt.Println("uncompressed size (bytes): ", len(buf.Bytes()))    return buf.Bytes()}
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

buf将被 GC 清理,无需调用buf.Reset(). buf.Reset()如果您想buf在已经使用过一次后重复使用,可以使用它。


例如:


package main


import (

    "bytes"

    "fmt"

)


func main() {

    var buf bytes.Buffer


    fmt.Fprint(&buf, "Hello")

    fmt.Println(buf.String()) // Prints "Hello"


    fmt.Fprintln(&buf, " World")

    fmt.Println(buf.String()) // Prints "Hello world"


    buf.Reset()


    fmt.Fprintln(&buf, "Reused!!!")

    fmt.Println(buf.String()) // Prints "Reused!!!"

}

我正在使用以下内容来保存结构 - 在短时间内非常多(数据库读写)


如果分配buf结果是一个性能问题,您可以重用buf将其提升到更高的范围并将其作为变量传递。例如:


func main() {

    var buf bytes.Buffer


    for(...) {

        ...

        ToBytes(someVar, &buf)

        ...

    }

}


func ToBytes(p interface{}, buf *bytes.Buffer) []byte {

    buf.Reset()

    enc := gob.NewEncoder(buf)

    err := enc.Encode(p)

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println("uncompressed size (bytes): ", len(buf.Bytes()))

    return buf.Bytes()

}


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

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