golang反射2个小例子的疑问?

写了2个小例子,第一个正确,为什么第二个报错啊? 我参数传结构,然后再ValueOf(指针)为啥就不行? 参数必须传指着吗? 那要是参数传的结构而不是指针那要怎样才行呢?

例子一:

type Man struct{
  Age int
  Name string
}
func test(arg interface{}){
  val := reflect.ValueOf(arg)
  val = val.Elem()
  if val.CanSet(){
    f := val.FieldByName("Name")
    f.SetString("xiao ming")
  }
}

func main(){
    man := Man{16,"xiaohong"}
    test(&man)
}

例子二:

type Man struct{
  Age int
  Name string
}
func test(arg interface{}){
  val := reflect.ValueOf(&arg)
  val = val.Elem()
  if val.CanSet(){
    f := val.FieldByName("Name") //这句触发panic
    f.SetString("xiao ming")
  }
}

func main(){
    man := Man{16,"xiaohong"}
    test(man)
}
阅读 2k
1 个回答
新手上路,请多包涵

你可以看看这样的例子:

package main

import (
    "reflect"
    "fmt"
)

type Man struct{
    Age int
    Name string
}
func test1(arg interface{}){
    fmt.Println("test1 arg", arg)
    fmt.Println("test1 arg的地址 ", &arg)
    val := reflect.ValueOf(arg)
    val = val.Elem()
    if val.CanSet(){
        f := val.FieldByName("Name") //这句触发panic
        f.SetString("xiao ming")
    }
}
func test2(arg interface{}){
    fmt.Println("test2 arg: ", arg)
    fmt.Println("test2 arg的地址: ", &arg)
    val := reflect.ValueOf(&arg)
    val = val.Elem()
    if val.CanSet() {
        f := val.FieldByName("Name") //这句触发panic
        f.SetString("xiao ming")
    }
}

func main() {
    man := Man{16,"xiaohong"}
    fmt.Println("man:", man)
    fmt.Println("man的地址:",&man)
    test1(&man)
    test2(man)
}

意思就是说,arg指的传进来的东西,&arg都指的是arg的地址,在两个函数中都是一样的,而我们想要struct的地址。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题