Yes, Go interfaces are row-polymorphic, in the sense that they allow you to write functions that operate on any struct which has a field with a certain name and type.
This utilizes the fact that structs implement interfaces implicitly in Go, rather than explicitly.
> I'm also wondering what the difference between row-polymorphism and ad-hoc polymorphism (a la C++ templates) is
C++ templates can also be row-polymorphic. They're a lot more flexible than just row polymorphism, though, because they essentially allow you to be polymorphic over any type for which a given expression is valid syntax.
Concepts were an attempt to allow developers to rein in some of that flexibility, since it actually became a pain.
Is this new with generics? I thought Go interfaces were just method sets?
"Go interfaces are row-polymorphic, in the sense that they allow you to write functions that operate on any struct which has a field with a certain name and type."
It doesn't have it yet. Go is headed strongly in that direction which is why I add the "yet", but see https://github.com/golang/go/issues/70128 , especially the "future directions" note about issue #48522 which is not implemented. Prepatory work has been done but the change is not in yet.
You can embed something like compile-time row types into Go if you implement it in terms of accessor methods that can be included in an interface, rather than direct struct field access, which has its pros and cons.
But if you're reading this in 2026 or beyond, check in with Go, this may not be true anymore.