1 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
不,不可能在不傳遞指向切片的指針的情況下附加到函數(shù)中的切片。這與反射無(wú)關(guān),而是與變量如何傳遞給函數(shù)有關(guān)。這是相同的代碼,修改為不使用反射:
package main
import (
"log"
)
type Person struct {
Name string
}
func AddWithPtr(slicep interface{}) {
sp := slicep.(*[]Person)
// This modifies p1 itself, since *sp IS p1
*sp = append(*sp, Person{"Sam"})
}
func Add(slice interface{}) {
// s is now a copy of p2
s := slice.([]Person)
sp := &s
// This modifies a copy of p2 (i.e. s), not p2 itself
*sp = append(*sp, Person{"Sam"})
}
func main() {
p1 := []Person{}
// This passes a reference to p1
AddWithPtr(&p1)
log.Println("Add with pointer: ", p1)
p2 := []Person{}
// This passes a copy of p2
Add(p2)
log.Println("Add without pointer:", p2)
}
(上面,當(dāng)它說(shuō)切片的“副本”時(shí),它并不意味著底層數(shù)據(jù)的副本 - 只是切片)
當(dāng)您傳入一個(gè)切片時(shí),該函數(shù)實(shí)際上得到一個(gè)新切片,該切片引用與原始數(shù)據(jù)相同的數(shù)據(jù)。附加到函數(shù)中的切片會(huì)增加新切片的長(zhǎng)度,但不會(huì)更改傳入的原始切片的長(zhǎng)度。這就是原始切片保持不變的原因。
- 1 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)