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 关注
- 79 浏览
添加回答
举报