Golang中方法接收者使用指针与非指针的区别

话不多说直接上代码:

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()
}

方法执行结果1
方法执行看起来没有问题,都输出了正确的结果,但是我们更换调用方式再看下:

func main() {
	//演示方法接受者使用指针和非指针的区别
	inter1 := newStruct1(2)
	inter1.squareValue()
	inter1.doubleValue()
}

方法执行结果2

可以看到,我们只是更换了方法的调用顺序,结果就与我们设想的不一样了。

分析原因:

  • 结果:方法接收者为指针调用时,我们可以改变接收者的属性,而当方法接收者为非指针调用时,则不会更改接收者的属性;
  • 原因:非指针接收者传递的是值的拷贝,指针接收者传递的是地址的拷贝,所以当方法接收者为指针时,更改接收者属性会影响到接收者;反之,当为非指针时则不会影响。

我这里只是比较浅显地说了自己的理解,可能有存在问题的地方,更底层的原理也没有深究,以后再慢慢补充相关知识吧。

你可能感兴趣的:(Golang)