1. 程式人生 > >Go語言反射之反射呼叫

Go語言反射之反射呼叫

文章目錄

1 概述

利用反射,不僅可以獲取資訊,還可以建立例項,執行函式和方法。就是反射代理執行。

2 建立例項

建立例項的前提是具有 reflect.Type 物件,基於此建立例項。使用 reflect.TypeOf() 函式,可以獲取得到某型別的 reflect.Type 物件,演示如下:

typeStu := reflect.TypeOf(Stu{})
s := reflect.New(typeStu)

s.Elem()
.FieldByName("Name").SetString("Hank") // 利用反射設定結構體欄位值 fmt.Println(s.Elem().FieldByName("Name").String()) // Hank

我們建立了例項,一直都是通過反射的方式操作的。

3 呼叫函式

如果值反射物件 reflect.Value 反射的是函式時,可以通過 reflect.Value 呼叫該函式。使用反射呼叫函式時,需要將引數使用反射值物件的切片 []reflect.Value 構造後傳入 Call() 方法中傳參。呼叫完成時,函式的返回值通過 []reflect.Value 返回。
演示如下:

func fn(p1, p2 int) int {
  return p1 + p2
}
func main() {
  valueFunc := reflect.ValueOf(fn)
  paramList := []reflect.Value{
    reflect.ValueOf(22),
    reflect.ValueOf(20),
  }
  // 反射呼叫函式
  resultList := valueFunc.Call(paramList)
  // 獲取第一個返回值, 取整數值
  fmt.Println(resultList[0].Int()) // 42
}

4 呼叫方法

整體與呼叫函式一致,額外的需要先通過物件的值反射獲取物件方法的反射物件,再使用 Call() 呼叫,示例:

type Stu struct {
  Name string
}

func (this *Stu) Fn(p1, p2 int) int {
  return p1 + p2
}

func main() {
  s := &Stu{"Hank"}
  valueS := reflect.ValueOf(s)
  method := valueS.MethodByName("Fn")
  paramList := []reflect.Value{
    reflect.ValueOf(22),
    reflect.ValueOf(20),
  }
  resultList := method.Call(paramList)
  fmt.Println(resultList[0].Int()) // 42
}

完!
原文出自:小韓說課
微信關注:小韓說課
小韓說課