先上代码
package main import "fmt" type myInt int //匿名函数 //值的接收 //指针的接收 //*myint表示myInt的指针类型 // *i表示指针i,指向i的值 func (i *myInt) add(another int) myInt { *i = *i + myInt(another) return *i } //i1与i是两个变量,传递值 func main() { i1 := myInt(1) i2 := i1.add(2) fmt.Println(i1,i2) }
值方法,指针方法遵循了如下规则:
接受者变量代表的值实际上是源值的复制品。如果这个值不是指针类型,在值方法中就没有途径去改变源值。
而指针值与其复制品指向的是同一个值,所以在指针方法中就存在了改变源值的途径。
如果接受者类型是引用类型或者它的别名类型,即使是值方法,也可以改变源值
-------------
对于某个非指针的数据类型,与它关联的方法的集合中只包含它的值方法。而对于它的指针类型,其方法集合中只包含它的值方法也包含指针方法。
在非指针数据类型的值上,也是能够调用其指针方法的。
这是因为GO在内部做了自动转换。
例如add方法是指针方法,那么表达式i1.add(2)会被自动转换为(&i1).add(2)
第二条规则对于编写接口类型的实现类型来说很重要。