英文:
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()
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论