Methods on generic types
September 6, 2023
Ready to dive back into generics, this time with regard to methods? Great, ‘cause here we go!
Method declarations
…
If the receiver base type is a generic type, the receiver specification must declare corresponding type parameters for the method to use.
Okay. Before we continue, let’s make sure we all know exactly what we’re talking about. What does it mean for a receiver base type to be a generic type? I think this is best illustrated by the example which comes a bit later in the spec:
type Pair[A, B any] struct { a A b B }
Okay. So given the above type Pair[A, B any]
, if we define a method on it, the receiver’s base type would be a generic type:
func (p Pair[A, B]) Swap() Pair[B, A] { … }
Hopefully now it makes a bit more sense exactly what we’re talking about. So let’s continue.
This (declaring the corresponding type parameters) makes the receiver type parameters available to the method.
In other words, this would be invalid:
type Pair[A, B any] struct {
a A
b B
}
func (p Pair) Swap() { ... }
because there’s then no way for the method to know the type parameters’ types.
Quotes from The Go Programming Language Specification Version of August 2, 2023