我很难学习反射、指针和接口的基础知识,所以这是另一个我似乎无法弄清楚的入门级问题。
这段代码完成了我想要它做的事情——我正在使用反射将另一条记录添加到类型为接口的切片中。
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)显示其中包含记录的切片。所以我的问题是,我是否有可能收到一个不是指针的切片,并且我仍然可以在其中编写一些代码来产生第一个场景中显示的结果?SamAdd()Add()
我最近的很多问题都围绕着这种主题,所以我仍然花了一些时间来弄清楚如何有效地使用反射包。
呼唤远方
相关分类