方法接收者

go语言给函数添加接收者,函数就被定义为该接收者类型的方法。
接收者是结构体时,可以是结构体类型、结构体指针类型。调用时不区分调用者是结构体还是结构体指针,go语言会自动转化为对应的结构体或结构体指针。
结构体指针类型能改变接收者的值。
调用实例如下:

type Dog struct {
}

func (d Dog) Set1() {
	fmt.Println("111")
}
func (d *Dog) Set2() {
	fmt.Println("222")
}

func CallD() {
	d1 := Dog{}
	d2 := &Dog{}
	d1.Set1() // 111
	d1.Set2() // 222
	d2.Set1() // 111
	d2.Set2() // 222
}

接口实现

结构体实现一个接口,只要实现接口对应的所有方法。结构体定义方法时,接收者有两种:结构体类型和结构体指针类型。对于实现接口的接收者是结构体还是指针需要注意区分。
结构体实现的接口,默认结构体指针也实现该接口
结构体指针实现的接口,默认结构体没有实现该接口
代码如下:

type D interface {
	Get(i int) bool
}

type Dog struct {
}
// Dog 类型实现接口D
func (d Dog) Get(i int) bool {
	fmt.Println(i)
	return true
}

func CallD() {
	dog := &Dog{}
	var d D
	d = dog // Dog 类型实现D接口,&Dog 类型也实现D
	d.Get(2) // 输出 2
}

结构体没有实现接口代码如下:

type D interface {
	Get(i int) bool
}

type Dog struct {
}
// Dog 类型实现接口D
func (d *Dog) Get(i int) bool {
	fmt.Println(i)
	return true
}

func CallD() {
	dog := Dog{}
	var d D
	// 编译失败。dog没有实现接口D
	d = dog
	d.Get(2) 
}