Golang methods with same name and arity, but different type
go, methods, struct
Solution
Because Go does not support overloading of user-defined functions on their argument types.
You can make functions with different names instead, or use methods if you want to "overload" on only one parameter (the receiver).
Problem
The following code works fine. Two methods operating on two different structs and printing a field of the struct: ``` type A struct { Name string } type B struct { Name string } func (a *A) Print() { fmt.Println(a.Name) } func (b *B) Print() { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} a.Print() b.Print() } ``` Shows the desired output in the console: ``` A B ``` Now, if I change the method signature in the following way I get an compile error. I just move the receiver of the method to the arguments of the method: ``` func Print(a *A) { fmt.Println(a.Name) } func Print(b *B) { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} Print(a) Print(b) } ``` I can't even compile the program: ``` ./test.go:22: Print redeclared in this block previous declaration at ./test.go:18 ./test.go:40: cannot use a (type *A) as type *B in function argument ``` Why is it that I can interchange struct types in the receiver, but not in the arguments, when the methods have the same name and arity?