Go语言反射获取如何应用?老男孩go培训周末班

    /    2019-04-10

反射获取应用

一、反射获取基本类型

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程序员开发

(2)

分享至