1.崩溃的原因
val2 := reflect.ValueOf(&arg2)
r2 := val2.Elem() // 这里只是得到了interface
// ....
if r2.CanSet(){
// 不能直接在interface上call FieldByName,所以panic
// 可以f := r2.Elem().FieldByName()得到"Name"字段
// 但是由于函数传的是值,会拷贝进interface,并不是指针,所以这里的f不是CanSet的
f := r2.FieldByName("Name")
f.SetString("猎豹")
}
2.“打印那里又是true”的原因是因为语言规范规定的
xXtTXXTtXtx
3.如果想通过传递指针修改元数据,可以这样改
package main
import (
"fmt"
"reflect"
)
type Animal struct{
Name string
Category string
}
func test(arg1 *Animal,arg2 interface{}){
val1 := reflect.ValueOf(arg1)
val2 := reflect.ValueOf(arg2)
r1 := val1.Elem()
r2 := val2.Elem()
if r1.CanSet(){
f := r1.FieldByName("Name")
f.SetString("狮子")
}
fmt.Printf("%#v\n", r1)
if r2.CanSet(){
f := r2.FieldByName("Name")
f.SetString("猎豹")
}
fmt.Printf("%#v\n", r2)
}
func main() {
animal := Animal{"老虎","猫科动物"}
test(&animal,&animal)
fmt.Printf("%#v\n", animal)
}