自己实现的反射

Posted hualou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己实现的反射相关的知识,希望对你有一定的参考价值。

package main

import (
    "errors"
    "fmt"
    "reflect"
)

type Student struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Teacher struct {
    name string
}

func (Student) Greet() {
    fmt.Println("hello")
}

func GetStructToJson(s interface{}) (map[interface{}]interface{}, error) {

    val := reflect.ValueOf(s)
    typ := reflect.TypeOf(s)
    kind := val.Kind()
    tm := make(map[interface{}]interface{})
    if kind != reflect.Struct {
        return tm, errors.New("不是struct")
    } else {
        for i := 0; i < typ.NumField(); i++ {
            key := typ.Field(i).Tag.Get("json")
            tm[key] = ConvertFieldValue(val.Field(i))
        }
    }
    for i := 0; i < val.NumMethod(); i++ {
        fmt.Println(typ.Method(i).Name)
        val.Method(i).Call(nil) //如果方法绑定的是指针对象这里不会执行读不到
    }
    return tm, nil

}

func ConvertFieldValue(value reflect.Value) interface{} {
    if value.Kind().String() == "string" {
        return value.String()
    }
    if value.Kind().String() == "int" {
        return value.Int()
    }
    return nil
}

func main() {
    m := Student{"夏华楼", 26}
    rm := reflect.ValueOf(&m).Elem() //反射修改结构体内容
    if rm.CanSet(){
        rm.Field(0).SetString("Jerry")
    }
    v, _ := GetStructToJson(m)
    fmt.Println(v)
    fmt.Println(Teacher{"allen"})
}




以上是关于自己实现的反射的主要内容,如果未能解决你的问题,请参考以下文章

Cg入门16:Fragment shader - 片段级光照

java反射--善用反射等于写活“代码“

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

利用反射手写代码实现spring AOP

12mmaction2 行为识别商用级别X3D复现 demo实现 检测自己的视频 Expanding Architecturesfor Efficient Video Recognition(代码片段

反射机制