在每次循环迭代中重新声明切片是否是错误的做法?

时间:2019-05-04 17:15:14

标签: go

例如:

for {
    myData := <-myChan
    buf := new(bytes.Buffer)
    encoder := gob.NewEncoder(buf)
    err := encoder.Encode(myData)
    ...

我可以将buf := new(...放在for循环上方以节省处理器和可能的内存,但这会引起任何问题吗?我看到的示例在循环中有new

编辑:对于上述情况,编码器可以超出for循环的位置,那么为什么不这样做(在我所看到的示例中)?

2 个答案:

答案 0 :(得分:7)

我希望重用缓冲区:

buf := new(bytes.Buffer)
for {
    buf.Reset()
    //...
}

答案 1 :(得分:0)

惯用的Go风格是编写尽可能清晰的代码,只要它能在时间和空间限制内解决手头的问题即可。

换句话说,我不会担心这里的效率,因为:

  1. 编译器可以进行巧妙的优化,以消除任何差异
  2. 几乎可以肯定,如果存在差异,则可以忽略不计

如果您发现分配占用了每次循环迭代的很大一部分,那么@peterSO在下面的答案是一个很好的模式,说明如何通过调用bytes.Buffer方法来重用Reset