1、「方法」概念介绍

带有接收者的函数称为方法,方法是 go 语言中一种替代面向对象的方式。函数内部可以使用接收者,使用完之后根据接收者的类型是值类型还是指针类型选择是否自动覆盖原接收者。

1456655-20220716175455351-455636636.png

可以随意安排函数定义的顺序,编译器会在执行前扫描每个文件。

2、接口变量的赋值

接口定义为一个方法的集合。方法包含实际的代码。换句话说,一个接口就是定义, 而方法就是实现。因此,接收者不能定义为接口类型,这样做的话会引起 invalid receiver type ... 的编译器错误。

接收者类型必须是 T 或 *T,这里的 T 是类型名。T 叫做接收者基础类型或 简称基础类型。

如果接收者是实现了接口定义申明的所有方法,那么称这个接收者实现了这个接口。

2.1 方法的接收者是值类型

当方法的接收者是值类型时,接口变量可以被赋值为指针类型或者值类型的接收者对象

2.2 方法的接收者是指针(引用)类型

Cannot use 'rocketProducer' (type RocketProducer) as the type Producer Type does not implement 'Producer' as the 'send' method has a pointer receiver

2.3 对象没有实现接口

Cannot use 'rabbitProducer' (type RabbitProducer) as the type Producer Type does not implement 'Producer' as some methods are missing: send(string) error

3、方法调用

接收者是指针则在方法修改对象的属性会影响原来的对象,如果接收者是对象,那么在方法中修改对象的属性不会影响原来的对象。跟上面的接口变量赋值略有不同,不管方法里的接收者是指针类型还是对象类型,都可以同时使用指针对象和值对象调用。golang 通过语法糖,使得值对象也能直接调用接收者为指针类型的方法。

输出

参考:golang杂记01-golang接口的赋值问题、GO接口赋值与方法接收者问题