1 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
為什么只生成一次,地址卻不同?
因?yàn)樵诘谝粋€(gè) for 循環(huán)中,您將其追加到它的容量之外,它的 inNew
設(shè)置為零,并將 的結(jié)果重新分配給它append
。詳見:為什么append()會(huì)修改提供的切片?(見例子)
像這樣使用同一個(gè)切片有什么問題嗎?
可能有。當(dāng)您使用 reslices
時(shí)s = s[:0]
,您重置的是長(zhǎng)度而不是容量。后備數(shù)組與之前的附加和重新分配操作中的相同。
因此,如果您再次追加到s2
,容量將足以不會(huì)導(dǎo)致重新分配,并且您最終將覆蓋后備數(shù)組的第一個(gè)元素:
一個(gè)示范性的例子:
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]
}
這可能沒問題,因?yàn)槟悻F(xiàn)在有一個(gè)擴(kuò)展容量的切片,不需要在追加時(shí)重新分配,但如果你的應(yīng)用程序保持其他切片頭指向相同的支持?jǐn)?shù)組(如s和s2),從而防止緩沖區(qū)的垃圾收集。
- 1 回答
- 0 關(guān)注
- 117 瀏覽
添加回答
舉報(bào)