方法接收者
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)
}