I think it's important to think of these features in terms of their smallest possible descriptions. One mistake with Java, I think, is that "inheritance" is how you do both polymorphism and composition (I know you can do either without inheritance, but it's especially a pain to do composition without).
With Go, polymorphism is done with interfaces. Composition is done with embedded fields (and the very convenient method promotion).
For example, bufio.NewReader would probably, in a language with generics, be phrased as a type with respect to a type parameter. Something like (in bastard Haskell)
In Go, it's: The interface argument is implicitly a type parameter here.This subset of generics covers a wide range of software components, even if it doesn't include the usual container types.