Все, конечно, знают, что такое метод структуры:
type counter struct {
val uint
}
func (c *counter) inc() {
c.val++
}Но не все знают, что метод реализован как обычная функция, у которой первым параметром идет значение получателя (или указатель на него):
// реализованы одинаково
func (c *counter) inc()
func inc(c *counter)
На практике это означает, что вы можете использовать метод как функцию:
inc := (*counter).inc
c := new(counter)
inc(c)
inc(c)
inc(c)
println(c.val)
// 3
Называется такое чудо «метод-выражение» (method expression).
P.S. А бывает еще метод-значение — это более причудливый зверь, замыкание на получателе.