Go语言反射获取
Posted Go程序员开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言反射获取相关的知识,希望对你有一定的参考价值。
Go语言反射获取
反射介绍
反射可以在运行时动态获取变量的相关信息。Go语言中reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值。
反射获取常用函数和方法:
func TypeOf(i interface{}) Type
TypeOf返回接口中保存的值的类型,TypeOf(nil)会返回nil。
func ValueOf(i interface{}) Value
ValueOf返回一个初始化为i接口保管的具体值的Value,ValueOf(nil)返回Value零值。
func (t Type) Elem() Type
返回map类型的键的类型。如非映射类型将panic
func (t Type) Field(i int) StructField
返回索引序列指定的嵌套字段的类型,等价于用索引中每个值链式调用本方法,如非结构体将会panic
func (tag StructTag) Get(key string) string
Get方法返回标签字符串中键key对应的值。如果标签中没有该键,会返回""。如果标签不符合标准格式,Get的返回值是不确定的。
反射获取应用
一、反射获取基本类型
package main
import (
"fmt"
"reflect"
)
func main() {
var o string = "oldboy"
// 返回值的类型
t := reflect.TypeOf(o)
fmt.Println("o type:", t)
// 返回具体值的Value
v := reflect.ValueOf(o)
fmt.Println("o value:", v)
}
运行结果:
o type: string
o value: oldboy
二、反射获取结构体
package main
import (
"fmt"
"reflect"
)
type School struct {
Name string
Course string
}
func main() {
o := School{
Name: "oldboy",
Course: "Golang",
}
t := reflect.TypeOf(o)
fmt.Println("o type:", t)
v := reflect.ValueOf(o)
fmt.Println("o value:", v)
}
运行结果:
o type: main.School
o value: {oldboy Golang}
三、反射获取结构体 Tag
1、获取结构体元素单一 Tag
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Course string
}
func getStructTag(i interface{}) {
t := reflect.TypeOf(i)
tag := t.Elem().Field(0).Tag.Get("json")
fmt.Printf("Name Tag:%s\n", tag)
tag = t.Elem().Field(1).Tag.Get("json")
fmt.Printf("Age Tag:%s\n", tag)
}
func main() {
stu := Student{
Name: "oldboy",
Age: 18,
Course: "Golang",
}
getStructTag(&stu)
}
运行结果:
Name Tag:stu_name
Age Tag:stu_age
2、获取结构体元素多个 Tag
package main
import (
"fmt"
"reflect"
)
func main() {
type User struct {
Name string `json:"user_name" xml:"UserName"`
}
u := User{
Name: "oldboy",
}
f := reflect.TypeOf(u).Field(0)
fmt.Println(f.Tag.Get("json"))
fmt.Println(f.Tag.Get("xml"))
}
3、循环获取结构体 Tag
package main
import (
"fmt"
"reflect"
)
func main() {
type User struct {
Name string "user name"
Passwd string `user passsword`
}
u := &User{
Name: "oldboy",
Passwd: "******",
}
s := reflect.TypeOf(u).Elem()
for i := 0; i < s.NumField(); i++ {
fmt.Println(s.Field(i).Tag)
}
}
下一篇:
Go语言反射操作------敬请期待!
第十一章 并发编程
11.1
11.2
11.3
11.4
看完本文有收获?那就分享给更多人吧
以上是关于Go语言反射获取的主要内容,如果未能解决你的问题,请参考以下文章