Go语言之 Struct Tag

在上一篇介绍Go反射的时候,提到了如何经过反射获取Struct的Tag,这一篇文章主要就是介绍这个的使用和原理,在介绍以前咱们先看一下JSON字符串和Struct类型相互转换的例子。json


JSON字符串对象转换


func main() {    var u User    h:=`{"name":"张三","age":15}`    err:=json.Unmarshal([]byte(h),&u)        if err!=nil{        fmt.Println(err)    }else {        fmt.Println(u)    }
}
type User struct{    Name string `name`    Age int `age`
}


上面这个例子就是Json字符串转User对象的例子,这里主要利用的就是User这个结构体对应的字段Tag,json解析的原理就是经过反射得到每一个字段的tag,而后把解析的json对应的值赋给他们。ide


利用字段Tag不光能够把Json字符串转为结构体对象,还能够把结构体对象转为Json字符串。spa


 newJson,err:=json.Marshal(&u)
 fmt.Println((string(newJson)))


接着刚刚的例子,这样就能够转为一个新的字符串了,经过打印输出,能够看到和开始输入的字符串同样。code


反射获取字段Tag


字段的Tag是标记到字段上的,因此咱们能够经过先获取字段,而后再获取字段上的Tag。orm


func main() {    var u User    t:=reflect.TypeOf(u)        for i:=0;i<t.NumField();i++{        sf:=t.Field(i)        fmt.Println(sf.Tag)    }
}


获取字段上一篇咱们提到过,获取字段后,调用.Tag就获取到对应的Tag字段了。对象


字段Tag的键值对


不少时候咱们的一个Struct不止具备一个功能,好比咱们须要JSON的互转、还须要BSON以及ORM解析的互转,因此一个字段可能对应多个不一样的Tag,以便知足不一样的功能场景。ci


Go Struct 为咱们提供了键值对的Tag,来知足咱们以上的需求。文档


func main() {    var u User    t:=reflect.TypeOf(u)        for i:=0;i<t.NumField();i++{        sf:=t.Field(i)        fmt.Println(sf.Tag.Get("json"))    }
}
type User struct{    Name string `json:"name"`    Age int `json:"age"`
}


以上的例子,使用了键值对的方式配置Struct Tag,Key-Value以冒号分开,这里的Key为json,因此咱们能够经过这个Key获取对应的值,也就是经过.Tag.Get("json"))方法。Get方法就是经过一个Key获取对应的tag设置。字符串


除此以外,咱们还能够设置多个Key,来知足咱们上面说的场景。string


func main() {    var u User    t:=reflect.TypeOf(u)        for i:=0;i<t.NumField();i++{        sf:=t.Field(i)        fmt.Println(sf.Tag.Get("json"),",",sf.Tag.Get("bson"))    }
}
type User struct{    Name string `json:"name" bson:"b_name"`    Age int `json:"age" bson:"b_age"`
}


多个Key使用空格进行分开,而后使用Get方法获取不一样Key的值。


Struct Tag能够提供字符串到Struct的映射能力,以便咱们做转换,除此以外,还能够做为字段的元数据的配置,提供咱们须要的配置,好比生成Swagger文档等。

相关文章
相关标签/搜索