That doesn't answer the question though.
Go channels (and slices and maps) are special built-in types that are already "generic", i.e. they have type parameters: "make(chan Foo, 10)".
Is there some property of the built-in buffered channel contract that makes it hard to implement as efficiently as this ring buffer?
Anyway. The ability to implement user-defined data structures with the full power of the language (e.g. building your own 'chan T') allows one to choose some different guarantees and target different use cases