1 回答
TA貢獻1827條經驗 獲得超8個贊
為什么只生成一次,地址卻不同?
因為在第一個 for 循環中,您將其追加到它的容量之外,它的 inNew設置為零,并將 的結果重新分配給它append。詳見:為什么append()會修改提供的切片?(見例子)
像這樣使用同一個切片有什么問題嗎?
可能有。當您使用 reslices時s = s[:0],您重置的是長度而不是容量。后備數組與之前的附加和重新分配操作中的相同。
因此,如果您再次追加到s2,容量將足以不會導致重新分配,并且您最終將覆蓋后備數組的第一個元素:
一個示范性的例子:
func TestSliceWithPool(t *testing.T) {
var slicePool = sync.Pool{
New: func() interface{} {
t.Log("Created")
s := make([]interface{}, 0)
return s
},
}
s, _ := slicePool.Get().([]interface{})
for i := 0; i < 10; i++ {
s = append(s, i)
}
fmt.Println(s)
// ^ output: [0 1 2 3 4 5 6 7 8 9]
s = s[:0]
slicePool.Put(s)
s2, _ := slicePool.Get().([]interface{})
fmt.Println(s)
// ^ output: []
for i := 0; i < 5; i++ {
s2 = append(s2, i*10)
}
fmt.Println(s2)
// ^ output: [0 10 20 30 40]
fmt.Println(s2[:10])
// ^ output: [0 10 20 30 40 5 6 7 8 9]
}
這可能沒問題,因為你現在有一個擴展容量的切片,不需要在追加時重新分配,但如果你的應用程序保持其他切片頭指向相同的支持數組(如s和s2),從而防止緩沖區的垃圾收集。
- 1 回答
- 0 關注
- 131 瀏覽
添加回答
舉報
