在将结构体转换为字节缓冲区(bytes.Buffer{})之后清理缓冲区。

huangapple go评论88阅读模式
英文:

cleanup buffer after struct to 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()
}

请注意,我只会返回翻译好的部分,不会回答关于翻译的问题。

英文:

I am using the following to save structs - very many in short time(database read and write). Do I need to clear the buffer or will it be cleaned up right after by garbage collection?

Or should dI use 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

得分: 2

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

例如:

package main

import (
	"bytes"
	"fmt"
)

func main() {
	var buf bytes.Buffer

	fmt.Fprint(&buf, "Hello")
	fmt.Println(buf.String()) // 输出 "Hello"

	fmt.Fprintln(&buf, " World")
	fmt.Println(buf.String()) // 输出 "Hello World"

	buf.Reset()

	fmt.Fprintln(&buf, "Reused!!!")
	fmt.Println(buf.String()) // 输出 "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("未压缩大小(字节):", len(buf.Bytes()))
	return buf.Bytes()
}
英文:

buf will be cleaned by the GC, no need to call buf.Reset(). buf.Reset() can be used if you want to reuse buf after you have already used it once.

For example:

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!!!"
}

> I am using the following to save structs - very many in short time(database read and write)

If allocation of buf turns out to be a performance issue, you could reuse buf lifting it to a higher scope and passing it in as variable. For example:

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()
}

huangapple
  • 本文由 发表于 2022年1月11日 04:39:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/70658632.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定