У меня были трудности с изучением основ рефлекса, указателей и интерфейса на ходу, поэтому вот еще один вопрос начального уровня, который я не могу понять.
Этот код выполняет то, что я хочу, - я использую отражение, чтобы добавить еще одну запись к фрагменту, который напечатан как интерфейс.
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()
, который даст результат, показанный в моем первом сценарии?
Многие из моих недавних вопросов танцуют вокруг этого вида предмета, поэтому мне все еще нужно время, чтобы понять, как эффективно использовать пакет отражения.