在开发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)
		}
	}
}

执行结果: