func (rcv RcvT) foo(arg1 TArg1, arg2 TArg2, ...) RtnT {
   ...
   // use rcv
}
This example shows some interesting properties of methods:
package main
import "fmt"
type MyInt struct {
	i int
}
// associate function to a structure
// *MyInt is a Receiver type (here, it's a pointer type)
// multiply is now a Receiver function. From now on it requires a receiver in order to be called: (*MyInt).multiply
// When called on MyInt instance pointer, a copy of that pointer is passed to this function.
func (mi *MyInt) multiply(i int) {
	mi.i = mi.i * i
}
// Receiver type can also be a value type.
// From now on it requires a receiver in order to be called: (MyInt).multiply
// When called on MyInt instance, a copy of that object is passed to this function.
func (mi MyInt) add(i int) {
	mi.i = mi.i + i
}
func assign_struct_function_to_var(mi *MyInt) {
	// Although function variable does not mention Receiver type...
	var f func(i int)
	// ...we can assign Receiver function to it!
	f = mi.multiply
	f(2)
	fmt.Printf("%d\n", mi.i)
	// function associated to struct can't be used in assignments on its own
	// error:
	// undefined: multiply
	// f = multiply
}
func main() {
	mi := MyInt{}
	mi.i = 1
	fmt.Printf("%d\n", mi.i)
	// function associated to struct can't be invoked on its own
	// error:
	// undefined: multiply
	// multiply(2)
	assign_struct_function_to_var(&mi)
}

No comments:
Post a Comment