Methods explained
yourbasic.org/golang
Go doesn't have classes, but you can define methods on types.

You can define methods on any type declared in a type definition.
- A method is a function with an extra receiver argument.
- The receiver sits between the
funckeyword and the method name.
In this example, the HasGarage method is associated with the House type.
The method receiver is called p.
type House struct {
garage bool
}
func (p *House) HasGarage() bool { return p.garage }
func main() {
house := new(House)
fmt.Println(house.HasGarage()) // Prints "false" (zero value)
}
Conversions and methods
If you convert a value to a different type, the new value will have the methods of the new type, but not the old.
type MyInt int
func (m MyInt) Positive() bool { return m > 0 }
func main() {
var m MyInt = 2
m = m * m // The operators of the underlying type still apply.
fmt.Println(m.Positive()) // Prints "true"
fmt.Println(MyInt(3).Positive()) // Prints "true"
var n int
n = int(m) // The conversion is required.
n = m // ILLEGAL
}
../main.go:14:4: cannot use m (type MyInt) as type int in assignment
It’s idiomatic in Go to convert the type of an expression to access a specific method.
var n int64 = 12345
fmt.Println(n) // 12345
fmt.Println(time.Duration(n)) // 12.345µs
(The underlying type of time.Duration is int64,
and the time.Duration type has a String method
that returns the duration formatted as a time.)
Further reading
Object-oriented programming without inheritance explains how composition, embedding and interfaces support code reuse and polymorphism in Go.