Go’s general principle is to prioritize on a solid core, and let third-party libraries converge on abstractions above that core, and to eventually bring some of these abstractions back into the stdlib.
There’s a great sense of pragmatism (not to mention egolessness) here; experiments are abandoned, the community is consulted, a strong base implementation is favored over all the bells and whistles at launch, etc.
Errors are typically wrapped using Go’s interface composition, and there wasn’t a built-in way to “unwrap” an error to get to the deepest level. Many libraries eventually provided this, and this was
brought into the stdlib at 1.13.
Go initially didn’t define a way to specify a dependency version, always downloading the latest one. The community came up with solutions to this (like
gopkg) that are (sort of?) coming back to vanilla Go via modules.
Generics are on the horizon, second in line after improvements to error handling. Mentioned
this other talk that contains more details.