The first pair is used to receive a parameter that is handled in a special way. This is called method receiver . It is a very similar way to how languages treat methods where there is an implicit parameter that is the this
object, but in the case of Go it is explicitly received. Being separate makes it easier for the compiler to identify the special condition. So the method is only applied to a specific type. This way you can call the function as a method, that is, you call the method according to the object in use. If you think well it makes even more sense than in other languages because you treat in the definition the parameter that is special and in the place that it is used in the call, even though the syntax is kind of weird.
The second pair is used to establish a tuple of parameters, equal to all languages.
The third pair is used to group the return type of the function that always comes after the function name and parameters. It is used because in the case the type is composed of a pointer and has the parameter name, so it avoids ambiguity and ensures that it is one thing.