在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/GO/ golang反射2個(gè)小例子的疑問(wèn)?

golang反射2個(gè)小例子的疑問(wèn)?

寫(xiě)了2個(gè)小例子,第一個(gè)正確,為什么第二個(gè)報(bào)錯(cuò)??? 我參數(shù)傳結(jié)構(gòu),然后再ValueOf(指針)為啥就不行? 參數(shù)必須傳指著嗎? 那要是參數(shù)傳的結(jié)構(gòu)而不是指針那要怎樣才行呢?

例子一:

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") //這句觸發(fā)panic
    f.SetString("xiao ming")
  }
}

func main(){
    man := Man{16,"xiaohong"}
    test(man)
}
回答
編輯回答
選擇

你可以看看這樣的例子:

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") //這句觸發(fā)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") //這句觸發(fā)panic
        f.SetString("xiao ming")
    }
}

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

意思就是說(shuō),arg指的傳進(jìn)來(lái)的東西,&arg都指的是arg的地址,在兩個(gè)函數(shù)中都是一樣的,而我們想要struct的地址。

2017年1月27日 11:55