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)
    }

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