1. 区别
- package main
- import (
- "fmt"
- )
- type Person struct {
- Name string
- }
- // 函数
- // 对于普通函数, 接收者为值类型时, 不能将指针类型的数据直接传递, 反之亦然
- func test01(p Person) { // 只能传值
- fmt.Println(p.Name)
- }
- func test02(p *Person) { // 只能传指针
- fmt.Println(p.Name)
- }
- // 对于方法 (如 struct 的方法),
- // 接收者为值类型时, 可以直接用指针类型的变量调用方法, 反过来同样也可以
- func (p Person) test03() {
- p.Name = "jack"
- fmt.Println("test03() =", p.Name) //jack
- }
- func (p *Person) test04() {
- p.Name = "mary"
- fmt.Println("test03() =", p.Name) //mary
- }
- func main() {
- p := Person{"tom"}
- test01(p)
- test02(&p)
- p.test03()
- fmt.Println("main() p.name=", p.Name) //tom
- // 陷阱
- (&p).test03() // 从形式上是传入地址, 但是本质仍然是值拷贝
- fmt.Println("main() p.name=", p.Name) //tom, 并没有别改变
- (&p).test04()
- fmt.Println("main() p.name=", p.Name) //mary
- p.test04() // 等价 (&p).test04 , 从形式上是传入值类型, 但是本质仍然是地址拷贝
- }
总结:
来源: http://www.bubuko.com/infodetail-3393715.html