在开发GO代码生成器的时候需要基于model反射获取字段信息生成CRUD代码,这里写了一个demo用于获取结构体的字段、值、Tag和函数执行:
type BaseUserMo struct {
Uri string `bson:"uri" json:"uri"`
Username string `bson:"username" json:"username"`
Password string `bson:"password" json:"password"`
Name string `bson:"name" json:"name"`
Email string `bson:"email" json:"email"`
CreateDate common.JsonTime `bson:"createdate" json:"createdate"`
}
func (this *BaseUserMo) CollectionName() string {
return "baseusermo"
}
func TestReflect(t *testing.T) {
obj := BaseUserMo{}
refType := reflect.TypeOf(obj) //这里使用对象,而不是引用
refValue := reflect.ValueOf(obj) //这里使用对象,而不是引用
log.Info("kind:", refValue.Kind())
if refValue.Kind() == reflect.Struct {
fieldCount := refType.NumField()
log.Info("fieldCount:", fieldCount)
//结构体字段获取
for i := 0; i < refType.NumField(); i++ {
f := refType.Field(i)
fV := refValue.Field(i).Interface()
fmt.Printf("name=%s , type=%v , value=%v , Tag=%s \n", f.Name, f.Type, fV, f.Tag)
}
//调用结构体方法,这个需要用指针&obj作为参数传递
meth := reflect.ValueOf(&obj).MethodByName("CollectionName")
resVals := meth.Call(nil)
for _, v := range resVals {
fmt.Printf("%v", v)
}
}
}
执行结果: