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 关注
- 96 浏览
添加回答
举报