Small introduction to tags in Go
machiel.me
machiel.me
Bonus, Gorethink tags [0] and how we use them at Lavaboom [1].
0: https://github.com/dancannon/gorethink#encodingdecoding-stru...
SourceGraph did a write up that summarized it very nicely. https://sourcegraph.com/blog/live/gophercon2015/123669868275
But that doesn't mean everyone should make the same choice. Go doesn't have macros or templates. It would make the language much larger and many Go development tools would have to be modified to deal with the complexity. This is a minimal language tweak that was far easier to implement, and devtools that don't care about tags can ignore them.
A better solution would have been a proper annotation system that is part of the spec.
Spent a whole day trying to figure out why only the first tag in the struct was 'active':
Name string `xml:"name", db:"name"` //<--- XML works, DB doesn't
Name string `db:"name", xml:"name"` //<--- DB works, XML doesn't
The answer was, going from memory, I added a comma (,) between the tags. Should have been: Name string `xml:"name" db:"name"`
Stupid simple mistake, but really hard to track down. There was no compiler error, the second tag failed silently, and the first tag worked, so it was really hard to find the bad code.That along with my favorite: quote-wars. Many-a-time did I forget the quotes on the tag itself only to have it fail (without warning again...):
Name string `xml:name db:"name"` //<--- DB works, XML doesn'tIMHO, this is why encoding meta-information into strings fail in every incarnation I've experienced. For a retro example, we need look no further than the various data base libraries which place the SQL in strings.
Bad things happen when the compiler is crippled by "tunneling" statements through strings.
That aside, tags are currently in use in several ORM frameworks with a fair amount of success.
Other than that, their usage (at least to me after working with Go for a year now) is limited to things like Toml/YAML decoding for configuration, or (shameless plug) configuration with https://github.com/vrischmann/envconfig.
func (a *Account) VerifyPassword(password string) (bool, bool, error) {
this is why we need sum types people
func (a *Account) VerifyPassword(password string) (isValid, wasUpdated bool, err error) {