很多第三方包都会使用自定的标签,比如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
需要传递的是一个结构体的指针。