接收者

接收者是将操作副本,可以理解成,在每一个方法中,它对属性的操作都是先创建一个该属性的副本,接着操作副本。

//单文件需要将包名改为main
package main

import (
  "fmt"
)

type class struct {
  data int
}

func (c class) Print() {
  fmt.Println(c.data)
}

func (c class) Change() {
  c.data = 2
}

func main() {
  /*
  output:
  1 
  */

  temp := class{1}
  temp.Change()
  temp.Print()
}

可以看出,temp的data并没有收到Change的改变。因为Change只是拷贝了一份副本,并没有对原数据进行操作。

指针接收者

//单文件需要将包名改为main
package main

import (
  "fmt"
)

type class struct {
  data int
}

func (c *class) Print() {
  fmt.Println(c.data)
}

func (c *class) Change() {
  c.data = 2
}

func main() {
  /*
  output:
  2
  */

  temp := &class{1}
  //temp = new(class)  另一种写法
  temp.Change()
  temp.Print()
}

可以看出来,指针接收者操作的是原数据。相比而言,指针接收者更像其他语言中的类的概念,其他可以类比成属性以及方法。