In other statically-typed languages like Haskell, Scala, or Rust, sometimes for things like identifiers, one would wrap them in special types to help the compiler catch errors (e.g. preventing you from passing in another in-scope String) and to improve readability of the code by encoding responsibility at the type-level.
Some examples:
newtype UserId = UserId Integer
or
case class UserId(value: Long) extends AnyVal
or
struct UserId(u64);
All of these offer (usually) no runtime costs and little added clutter for improved peace of mind and dev-time documentation at the type level.
Go also has this ability:
type UserId uint64
My question is not whether or not this is possible, but whether this is something that is widespread and/or considered idiomatic or not in Go, and why.