我在学习 go 中反射、指针和接口的基础知识时遇到了困难,所以这是另一个我似乎无法弄清楚的入门级问题。
这段代码做了我想做的事——我正在使用反射将另一条记录添加到作为接口输入的切片中。
package main
import (
"reflect"
"log"
)
type Person struct {
Name string
}
func Add(slice interface{}) {
s := reflect.ValueOf(slice).Elem()
// in my actual code, p is declared via the use of reflect.New([Type])
p := Person{Name:"Sam"}
s.Set(reflect.Append(s,reflect.ValueOf(p)))
}
func main() {
p := []Person{}
Add(&p)
log.Println(p)
}
如果我将 Add 和 main 函数更改为此,事情就不会按照我想要的方式工作。
func Add(slice interface{}) {
s := reflect.ValueOf(&slice).Elem()
p := Person{Name:"Sam"}
s.Set(reflect.Append(reflect.ValueOf(slice),reflect.ValueOf(p)))
log.Println(s)
}
func main() {
p := []Person{}
Add(p)
log.Println(p)
}
也就是说,log.Println(p)
最后没有Sam
像我希望的那样显示包含记录的切片。 所以我的问题是我是否有可能Add()
收到一个不是指针的切片,并且我仍然在其中编写一些代码Add()
会产生第一个场景中显示的结果?
我最近的很多问题都围绕着这种主题,所以我仍然需要一段时间才能弄清楚如何有效地使用反射包。