Go中的指针类型有一个约定:任一指针具有其地址指带的实体(最常见的是结构体,当然也可以是字符串、数字或者其他指针等)的所有属性、方法,这样“智能”的设定下使得我们可以 *** f ***
使用类型B的实例b给接口类型A的变量a赋值时,根据B实现A中定义的方法的接收者类型的不同(指针还是值),b的类型(指针还是值)有一些约束:
1、接收者类型是指针:这种情况下方法可能存在副作用(可能导致对方法接收者的修改),而对于接口类型的变量,如果它的值的类型是“值”那么go无法从这个变量中获取指针(原因比较深奥),这个值只是一个副本,那么上述的方法“副作用”是无法实现的,所以go认为赋值给;
2、接收者类型是值:方法没有副作用,方法内的值是个实际值副本,所以b不论为指针还是实例,接收者方法都不会有副作用,这时go不会强行要求;
由于Go中没有方法重载机制,所以以上同名方法只能存在一个。
另,要分清方法中的方法接收者和方法参数,当不讨论接口类型的赋值时,定义方法时不论将接收声明为指针还是实例,在调用方法时go都将自动将接收者转换为合适的类型(是否有副作用得看方法内部实现);而方法参数的类型是严格规定好的,无法进行转换。