不,如果不传入指向片的指针,就不可能附加到函数中的片。这与反射无关,而是与变量如何传入函数有关。下面是相同的代码,修改为不使用反射:
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)
}
(上面,当它表示切片的“copy”时,并不意味着底层数据的拷贝-只是切片)
当您传入一个切片时,函数将有效地获取一个新切片,该切片引用与原始切片相同的数据。在函数中附加到切片会增加新切片的长度,但不会更改传入的原始切片的长度。这就是原始切片保持不变的原因。