golang 反射从入门到放弃

反射

import “reflect”

使用ValueOf 函数,创建反射值:

reflectValue:=reflect.ValueOf(i)

通过interface 创建对象


func Create(in interface{}) interface{} {
	typeof := reflect.TypeOf(in)
	if typeof.Kind() != reflect.Ptr {
		panic("no suport")
	}
	retImpl := reflect.New(typeof.Elem())
	return retImpl.Interface()
}

type Test struct {
}

func main(){
	test:=Create(&Test{})
	t:=test.(*Test{}
	if t == nil {
		panic("fail")
	}
}

遍历Field

如果是struct 类型,可以使用reflect 对struct 进行遍历

package main

import (
	"fmt"
	"reflect"
)

type MyStruct struct {
	A string
	B string
}

func main() {
	a := MyStruct{A: "a", B: "b"}
	reflectA := reflect.ValueOf(a)
	for i := 0; i < reflectA.NumField(); i++ {
		structField := reflectA.Type().Field(i)
		fieldValue := reflectA.Field(i)
		fmt.Printf("field:%s\n", structField.Name)
		fmt.Printf("value:%#v\n", fieldValue.Interface())
	}
}

获取Field 的Tag

reflect.ValueOf(mystruct).Type().Field(0).Tag

遍历函数

v := reflect.ValueOf(c)
for i := 0; i < v.NumMethod(); i++ {
	method := v.Type().Method(i)
	log.Printf("method name:%s\n", method.Name) // 获取方法名

}

调用函数

	v := reflect.ValueOf(c)
	i:=0
	if v.Method(i).Type().NumIn() > 0 {
		in := v.Method(i).Type().In(0)  // 获取第一个参数(NumIn 获取参数数目)
		inArgs :=  make([]reflect.Value, method.Type().NumIn())
		// 如果第一个参数是指针类型
		inPut := reflect.New(in.Elem()) // 创建第一个参数实体
		in[0]=reflect.ValueOf(inPut)
		response := method.Call(in)
		log.Printf("response:%#v\n", response)
	}

反射有很多坑,但是却可以让你写出更通用,功能更强大、智能的代码,不建议多用,但在改用的时候,还是得用。

humboldt Written by:

humboldt 的趣味程序园