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
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语言反射获取的主要内容,如果未能解决你的问题,请参考以下文章

Go语言之Go语言反射

10. Go 语言反射

go语言系列-反射

Go语言(十五) 反射

go语言学习笔记 — 进阶 — 反射:反射的类型对象(reflect.Type)— 使用反射获取结构体的成员变量类型

Go语言之reflection