1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
&sl[i]
i
不復(fù)制 slice 元素,它只是計(jì)算第th 個(gè)元素的地址。
切片元素充當(dāng)變量,并&x
計(jì)算為變量的地址x
。想一想:既然&sl[i]
是第th個(gè)元素的地址i
,這個(gè)地址既不需要也不用到struct的值,為什么還要復(fù)制呢?
如果你的切片太大以至于你擔(dān)心(隱式)副本的性能影響,你真的應(yīng)該首先考慮在切片中存儲(chǔ)指針,這樣你就可以使你的循環(huán)和訪(fǎng)問(wèn)元素變得更加簡(jiǎn)單,而無(wú)需擔(dān)心副本:
func myFunc(sl []*MyStruct) {
? ? for _, v := range sl {
? ? ? ? v.P = "bar"
? ? ? ? // other properties mutations
? ? }
}
另請(qǐng)注意,如果您的切片包含非指針,并且您想要更改切片元素的字段,則索引切片并引用該字段也不涉及復(fù)制結(jié)構(gòu)元素:
func myFunc(sl []MyStruct) {
? ? for i := range sl {
? ? ? ? sl[i].P = "bar"
? ? ? ? // other properties mutations
? ? }
}
是的,如果您必須修改多個(gè)字段,這可能會(huì)更冗長(zhǎng)并且效率可能更低(但編譯器也可能識(shí)別并優(yōu)化多個(gè)表達(dá)式的評(píng)估sl[i])。
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報(bào)