I like the simplicity and how opinionated Go is. There's typically one way to do things and that's incredibly useful.

But lack of real enums for me falls into the "How is this a thing?" bucket.

Like Java introduced what are (IMHO) a pretty good enum almost 20 years ago. Java enums are classes, basically. They can have state and methods. Super-useful.

I like Hack but Hack's enums are a little weird in the sense that you have a bit of an odd syntax to indicate if automatic coercion is allowed.

I like the idea in this post as being better than straight strings or ints but there are still 2 downsides:

1. As a variable (not a constant) it gives the compiler less options on how this can be optimized; and

2. (This is the big one) One of the best things about enums is using them in switch statements such that adding a new value will cause a compiler error (assuming you don't use a default branch, which should be discouraged for this).

Rust enums and match expressions, for example, cover all of this.

Not that it's a great solution, but there's https://github.com/BurntSushi/go-sumtype for (2).