Golang 反射调用函数和方法

定义函数变量

package main

import "fmt"

func hello() {
  fmt.Println("Hello world!")
}

func main() {
  hl := hello
  hl()
}

反射调用函数

func prints(i int) string {
  fmt.Println("i =",i)
  return strconv.Itoa(i)
}

func main() {
  fv := reflect.ValueOf(prints)
  params := make([]reflect.Value,1)  //参数
  params[0] := reflect.ValueOf(20)   //参数设置为20
  rs := fv.Call(params)              //rs作为结果接受函数的返回值
  fmt.Println("result:",rs[0].Interface().(string)) //当然也可以直接是rs[0].Interface()
}

反射中调用方法

type MyType struct {
  i int
  name string
}

func (mt *MyType) SetI(i int) {
  mt.i = i
}

func (mt *MyType) SetName(name string) {
  mt.name = name
}

func (mt *MyType) String() string {
  return fmt.Sprintf("%p",mt) + "--name:" + mt.name + " i:" + strconv.Itoa(mt.i) 
}

func main() {
  myType := &MyType{22,wowzai}
  //fmt.Println(myType)     //就是检查一下myType对象内容
  //println("---------------")
  mtV := reflect.ValueOf(&myType).Elem()
  fmt.Println("Before:",mtV.MethodByName("String").Call(nil)[0])
  params := make([]reflect.Value,1)
  params[0] = reflect.ValueOf(18)
  mtV.MethodByName("SetI").Call(params)
  params[0] = reflect.ValueOf("reflection test")
  mtV.MethodByName("SetName").Call(params)
  fmt.Println("After:",mtV.MethodByName("String").Call(nil)[0])
}

也可以这样

mtV := reflect.ValueOf(&myType).Elem()
fmt.Println("Before:",mtV.Method(2).Call(nil)[0])
params = make([]reflect.Value,1)
params[0] = reflect.ValueOf(18)
mtV.Method(0).Call(params)
params[0] = reflect.ValueOf("reflection test")
mtV.Method(1).Call(params)
fmt.Println("After:",mtV.Method(2).Call(nil)[0])


转载于:https://my.oschina.net/u/1996047/blog/299029

你可能感兴趣的:(Golang 反射调用函数和方法)