利用 go 反射机制,通过 不同的 tag name 进行不同的处理

package main

import (
    "fmt"
    "reflect" // 这里引入reflect模块
)
// 自定义 tag
const tagName = "validate"

type employee struct {
    ID       int     `json:"id"`
    Name     string  `json:"名字" validate:"presence,min=2,max=40"`
    Age      int     `json:"年龄"`
    Desc     string  `json:"描述" back:"好看否"`
    weight   float64 `json:"weight" 单位:"kg"`
    Salary   float64 `json:"-"`
    Email    string  `validate:"email,required"`
    MateName string  `json:"mate_name,omitempty"`
}

func test2() {
    zhangsan := employee{
        ID:       1,
        Name:     "张三",
        Age:      18,
        Desc:     "秀色可餐",
        weight:   48.0,
        Salary:   12.0,
        MateName: "Prince",
    }
    t := reflect.TypeOf(zhangsan)

    fmt.Println("Type: ", t.Name())
    fmt.Println("Kind: ", t.Kind())
    fmt.Println(t.NumField())

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        // 仅获取 tagname 为我们定义的 tag值
        tag := field.Tag.Get(tagName) // 核心 :tagName="json","xml","pb"
        fmt.Printf("%d. %v(%v), tag:'%v'\n", i+1, field.Name, field.Type.Name(), tag)

    }
}

func main() {
    test2()
}