【发布时间】:2018-09-01 06:39:23
【问题描述】:
我在学习 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() 中编写一些代码来产生我第一个场景中显示的结果?
我最近的很多问题都围绕着这种主题,所以我仍然需要一段时间才能弄清楚如何有效地使用反射包。
【问题讨论】:
标签: go go-reflect