Go方法和函数的区别

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 , 从形式上是传入值类型,但是本质仍然是地址拷贝


}

总结:

猜你喜欢

转载自www.cnblogs.com/yzg-14/p/12231822.html