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

我正在使用以下内容来保存结构 - 在很短的时间内很多(数据库读取和写入)。我需要清除缓冲区还是在垃圾收集后立即清除它?


还是应该使用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()

}


慕村225694
浏览 84回答 1
1回答

料青山看我应如是

buf将被 GC 清理,无需调用buf.Reset(). buf.Reset()如果您想buf在已经使用过一次后重复使用,可以使用它。例如:package mainimport (    "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()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go