go语言reflect包使用的几个场景

go语言reflect包使用的几个场景,第1张

概述reflect包的几个使用场景: 1. 遍历结构体字段名(避免代码的硬编码) 2. 调用结构体方法(自动映射) 3. 获取结构体的tag标记的值(json/xml转换) 4. // @todo更多的使用场景 代码: 一、$GOPATH/reflectusage/main.go: // reflect使用场景package mainimport ( "errors" "fmt"

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包使用的几个场景所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1287972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存