Now that we’ve covered function declarations, let’s discuss the more nuanced topic of method declarations, which can be thought of as special case of of function declarations.
Method declarations
A method is a function with a receiver. A method declaration binds an identifier, the method name, to a method, and associates the method with the receiver’s base type.
MethodDecl = "func" Receiver MethodName Signature [ FunctionBody ] . Receiver = Parameters .
Before we dive into the details and nuances over the next few days, let’s summarize with a simple example:
type Person struct {
Name string
}
func (p *Person) Hello() {
fmt.Printf("Hello, %s\n", p.Name)
}
Here Hello
is declared as a method of *Person
. This is evident by the fact that it has a receiver (the function argument that preceeds the name of the function).
As an aside, there are two ways to call a method in Go. The most natural/obvoius one, you likely can guess, or have seen:
var p Person{Name: "Bob"}
p.Hello() // Call the Hello() method on the p variable
The other, which you’ll probably never need, but also exists, is to pass the receiver as a direct argument to the fully qualified method name. This doesn’t require defining a variable first:
(*Person).Hello(&Person{Name: "Alice"})
Quotes from The Go Programming Language Specification Version of August 2, 2023