1 回答

TA貢獻1856條經驗 獲得超11個贊
不,不可能在不傳遞指向切片的指針的情況下附加到函數中的切片。這與反射無關,而是與變量如何傳遞給函數有關。這是相同的代碼,修改為不使用反射:
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)
}
(上面,當它說切片的“副本”時,它并不意味著底層數據的副本 - 只是切片)
當您傳入一個切片時,該函數實際上得到一個新切片,該切片引用與原始數據相同的數據。附加到函數中的切片會增加新切片的長度,但不會更改傳入的原始切片的長度。這就是原始切片保持不變的原因。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報