Help you to get golang struct's tags elegantly.
Install gtag by running:
go get -u github.com/wolfogre/gtag/cmd/gtag
and ensuring that $GOPATH/bin
is added to your $PATH
.
A source file user.go
:
package tutorial
type User struct {
Id int `bson:"_id"`
Name string `bson:"name"`
Email string `bson:"email"`
}
Run
gtag -types User -tags bson .
and you will get file user_tag.go:
// Code generated by gtag. DO NOT EDIT.
// See: https://github.com/wolfogre/gtag
//go:generate gtag -types User -tags bson .
package tutorial
import (
"reflect"
"strings"
)
var (
// ...
)
// UserTags indicate tags of type User
type UserTags struct {
Id string
Name string
Email string
}
// Tags return specified tags of User
func (User) Tags(tag string, convert ...func(string) string) UserTags {
conv := func(in string) string { return strings.TrimSpace(strings.Split(in, ",")[0]) }
if len(convert) > 0 && convert[0] != nil {
conv = convert[0]
}
_ = conv
return UserTags{
Id: conv(tagOfUserId.Get(tag)),
Name: conv(tagOfUserName.Get(tag)),
Email: conv(tagOfUserEmail.Get(tag)),
}
}
// TagsBson is alias of Tags("bson")
func (v User) TagsBson() UserTags {
return v.Tags("bson")
}
Now you can use the generated code to get tags elegantly:
// update mongo document
tags := User{}.TagsBson()
_, err := collection.UpdateOne(
ctx,
bson.M{tags.Id: id},
bson.M{
"$set", bson.M{
tags.Name: name,
tags.Email: email,
},
},
)
Gtag is beta and is considered feature complete.