我有一個程序使用緩衝池來減少代碼中幾個性能敏感部分的分配。什麼是最簡單的方法來擴大其「容量」切片?
像這樣:play link
// some file or any data source
var r io.Reader = bytes.NewReader([]byte{1,2,3})
// initialize slice to max expected capacity
dat := make([]byte, 20)
// read some data into it. Trim to length.
n, err := r.Read(dat)
handle(err)
dat = dat[:n]
// now I want to reuse it:
for len(dat) < cap(dat) {
dat = append(dat, 0)
}
log.Println(len(dat))
// add it to free list for reuse later
// bufferPool.Put(dat)
我始終分配固定長度切片,這是保證比所需的最大尺寸。我需要將大小減小到實際的數據長度以使用緩衝區,但是我還需要它在下次需要時再次讀取最大大小。
我知道擴大切片的唯一方法是用append
,所以這就是我正在使用的。循環雖然感覺超級骯髒。並且可能效率低下。我的基準測試表明它並不可怕,但我覺得必須有更好的方法。
我只知道片的內部表示,但如果我只能以某種方式覆蓋長度值而不實際添加數據,那將是非常好的。我不需要將它歸零或任何東西。
有沒有更好的方法來實現這個目標?
哇,我現在感到很傻。我發誓我嘗試了這一點,並走出了界限或什麼。但只要你保持在能力之下,它確實有效。 – captncraig