话不多说直接上代码:
type interface1 interface {
doubleValue()
squareValue()
}
func newStruct1(value int) interface1 {
return &struct1{value}
}
type struct1 struct {
value int
}
func (s struct1) doubleValue() {
s.value = s.value * 2
fmt.Println(s.value)
}
func (s *struct1) squareValue() {
s.value = s.value * s.value
fmt.Println(s.value)
}
这里我们定义了一个接口,包含两个方法分别是乘2、求平方,区别是乘2方法的实现是采用非指针接收的,求平方的是采用指针接收的。
先看下如下调用方法的执行结果:
func main() {
//演示方法接受者使用指针和非指针的区别
inter1 := newStruct1(2)
inter1.doubleValue()
inter1.squareValue()
}
方法执行看起来没有问题,都输出了正确的结果,但是我们更换调用方式再看下:
func main() {
//演示方法接受者使用指针和非指针的区别
inter1 := newStruct1(2)
inter1.squareValue()
inter1.doubleValue()
}
可以看到,我们只是更换了方法的调用顺序,结果就与我们设想的不一样了。
分析原因:
- 结果:方法接收者为指针调用时,我们可以改变接收者的属性,而当方法接收者为非指针调用时,则不会更改接收者的属性;
- 原因:非指针接收者传递的是值的拷贝,指针接收者传递的是地址的拷贝,所以当方法接收者为指针时,更改接收者属性会影响到接收者;反之,当为非指针时则不会影响。
我这里只是比较浅显地说了自己的理解,可能有存在问题的地方,更底层的原理也没有深究,以后再慢慢补充相关知识吧。