指向结构体的指针

p.xxx<=>(&p).xxx

先看一个例子

type Person struct {
	name string
	age int
}

func (p Person) foo() {
	fmt.Println("foo")
}

func (p *Person) bar() {
	fmt.Println("bar")
}

func main() {
	p1 := Person{"p1", 0}
	p2 := &Person{"p2", 0}

	fmt.Println(p1.age)
	fmt.Println(p2.age)

	p1.age++
	fmt.Println(p1.age)
	p2.age++
	fmt.Println(p2.age)

	p1.foo()
	p2.foo()

	p1.bar()
	p2.bar()
}
(&p1).bar()

&p 也有用处

除了方法接受者写成指针类型的方能改变结构体中的字段值,还有当我们传递指针类型的变量,比如说传递指向结构体的指针时候方能在其他函数中来对结构体的数据进行修改,所以我们平常看到用指向结构体的指针用的比较多的原因

方法接收者是指针

我们看一个例子:

type Person struct {
	name string
	age int
}

func (p Person) foo() {
	p.age++
}

func (p *Person) bar() {
	p.age++
}

func main() {
	p := Person{}
	fmt.Println(p)
	
	p.foo()
	fmt.Println(p)

	// 上面说过了 p 是不是指针类型效果都一样
	p.bar()
	fmt.Println(p)
}

最后我们看下输出的三行数据,第一行的 age=0,第二行 age=0,第三行 age=1

因为只有在方法接受者是指针类型情况下才能很好的修改其字段值!