go结构体如何获取自定义的标签tag

发布于 2020-04-13 12:00:10 阅读 68

很多第三方包都会使用自定的标签,比如gorm中会定义主键,如下是本博客的部分字段,

type WpsPost struct {
    ID            uint   `gorm:"primary_key" json:"id"`
    UserID        uint   `json:"user_id"`
    PostTitle     string `json:"post_title"`
    PostIntro     string `json:"post_intro"`
    PostStatus    uint8  `json:"post_status"`
    CreatedAt     uint   `json:"create_time"`
    UpdatedAt     uint   `json:"updated_at"`
    PublishTime   uint   `json:"publish_time"`
    Disabled      uint8  `json:"disabled"`
}

在这个数据结构中,我们定义了ID为主键(primary_key),并且在数据库对应的字段为id

那么gorm怎么知道这个结构体哪个是主键呢?通过怎样的操作获取到结构体的字段对应数据库的字段呢?换句话说,如何通过go结构体获取自定义的标签(本例中的gorm与json 两个标签)?

聪明的同学们肯定会想到,用go语言的反射即可。

    post := &WpsPost{
        ID:          2,
        UserID:      2,
        PostTitle:   "reflect",
        PostIntro:   "reflect test",
        PostStatus:  1,
        PublishTime: uint(time.Now().Unix()),
        Disabled:    0,
    }
    s := reflect.TypeOf(post).Elem()
    for i := 0; i < s.NumField(); i++ {
        fmt.Printf("json:%s; ", s.Field(i).Tag.Get("json"))
        gorm := s.Field(i).Tag.Get("gorm")
        if gorm != "" {
            fmt.Printf("gorm:%s", gorm)
        }
        fmt.Println("")
    }

运行结果

json:id; gorm:primary_key
json:user_id; 
json:post_title; 
json:post_intro; 
json:post_status; 
json:create_time; 
json:updated_at; 
json:publish_time; 
json:disabled;

这里有一个注意点是,reflect.TypeOf(post)中的post 需要传递的是一个结构体的指针。