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)
}