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)
}
//对于方法,接受者为值类型时,可以直接用指针类型的变量调用方法,反之亦然
func (p Person) test03() {
p.Name = "jack"
fmt.Println("test03() =", p.Name) //jack
}
func (p *Person) test04() {
p.Name = "mary"
fmt.Println("test04() =", p.Name) //mary
}
func main() {
//不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法是和哪种类型绑定的
//如果是和值类型绑定,则为值拷贝。如果是和指针类型绑定,则是地址拷贝
p := Person{"tom"}
test01(p)
test02(&p)
p.test03()
fmt.Println("main() =", p.Name) //tom
(&p).test04()
fmt.Println("main() =", p.Name) //mary
}