@Arnaud: I tend to agree that it's a downside of having two ways to do things. However, I don't know how we would get the actually additive expressive power of generics without that downside. If you have any ideas, that would be great.
@Robert: I think sweeping statements about the performance of generic code vs. non-generic code are premature. In particular, in a situation where *either* generics *or* interfaces can be used for the same effect, I think the goal should be for both to perform equivalently. In those cases, there is nothing preventing the compiler from doing exactly the same optimizations - that is, nothing in the language prescribing that an interface needs to be passed and used as a boxed value, instead of devirtualizing the function to operate on each concrete type it is called with. In fact, AIUI, go 1.16 will already be significantly more clever about doing that optimization.
Of course there *are* cases where it's not possible to devirtualize a function. But in those cases, generics will run into similar problems.
I think it remains to be seen, if and when there is a performance benefit and how large it is. Personally, *because* I would prefer us to continue to favor interface-code where it can be used and only reach for generics if they are necessary, I would very much like them to perform similarly, so people don't use generics just "because they're faster".