reflect包的几个使用场景:
1. 遍历结构体字段名(避免代码的硬编码)
2. 调用结构体方法(自动映射)
3. 获取结构体的tag标记的值(Json/xml转换)
4. // @todo更多的使用场景
代码:
一、$GOPATH/reflectusage/main.go:
// reflect使用场景package mainimport ( "errors" "fmt" "reflect" "reflectusage/config")func main() { // 创建Conf实例 conf := config.Conf{} opname := "create" conf.Op = &opname conf.Port = 3308 fmt.Printf("conf.Port=%d\n\n",conf.Port) // 结构信息 t := reflect.TypeOf(conf) // 值信息 v := reflect.ValueOf(conf) printStructFIEld(&t) callMethod(&v,"SayOp",[]interface{}{" Db"}) // panic: reflect: Call of unexported method //callMethod(&v,"getDbConf",[]interface{}{}) getTag(&t,"Op","Json") getTag(&t,"xml") getTag(&t,"nofIEld","Json")}// 场景1:遍历结构体字段名func printStructFIEld(t *reflect.Type) { fIEldNum := (*t).NumFIEld() for i := 0; i < fIEldNum; i++ { fmt.Printf("conf's fIEld: %s\n",(*t).FIEld(i).name) } fmt.Println("")}// 场景2:调用结构体方法func callMethod(v *reflect.Value,method string,params []interface{}) { // 字符串方法调用,且能找到实例conf的属性.Op f := (*v).MethodByname(method) if f.IsValID() { args := make([]reflect.Value,len(params)) for k,param := range params { args[k] = reflect.ValueOf(param) } // 调用 ret := f.Call(args) if ret[0].Kind() == reflect.String { fmt.Printf("%s Called result: %s\n",method,ret[0].String()) } } else { fmt.Println("can't call " + method) } fmt.Println("")}// 场景3:获取结构体的tag标记func getTag(t *reflect.Type,fIEld string,tagname string) { var ( tagVal string err error ) fIEldVal,ok := (*t).FIEldByname(fIEld) if ok { tagVal = fIEldVal.Tag.Get(tagname) } else { err = errors.New("no fIEld named:" + fIEld) } fmt.Printf("get struct[%s] tag[%s]: %s,error:%v\n",fIEld,tagname,tagVal,err) fmt.Println("")}// @todo更多的使用场景
二、$GOPATH/reflectusage/config/config.go:
package configtype Db struct { Port int Host string pw string}type Conf struct { Op *string `Json:"Jsonop" xml:"xmlOpname"` CharList *string Length *int Num *int Output *string input *string hIDden *string Db}func (this Conf) SayOp(subname string) string { return *this.Op + subname}func (this Conf) getDbConf() Db { return this.Db}
三、输出:
conf.Port=3308conf's fIEld: Opconf's fIEld: CharListconf's fIEld: Lengthconf's fIEld: Numconf's fIEld: Outputconf's fIEld: inputconf's fIEld: hIDdenconf's fIEld: DbSayOp Called result: create Dbget struct[Op] tag[Json]: Jsonop,error:<nil>get struct[Op] tag[xml]: xmlOpname,error:<nil>get struct[nofIEld] tag[Json]:,error:no fIEld named:nofIEld总结
以上是内存溢出为你收集整理的go语言reflect包使用的几个场景全部内容,希望文章能够帮你解决go语言reflect包使用的几个场景所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)