自己实现的反射
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 - 片段级光照
为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?
12mmaction2 行为识别商用级别X3D复现 demo实现 检测自己的视频 Expanding Architecturesfor Efficient Video Recognition(代码片段