Go语言自学系列golang方法接收者类型
视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客
结构体实例,有值类型和指针类型,那么方法的接收者是结构体,那么也有值类型和指针类型。区别就是接收者是否复制结构体副本。值类型复制,指针类型不复制。值类型结构体和指针类型结构体
实例package main import "fmt" type Person struct { name string } func main() { p1 := Person{name: "tom"} fmt.Printf("p1: %T ", p1) p2 := &Person{name: "tom"} fmt.Printf("p2: %T ", p2) }
运行结果[Running] go run "d:SynologyDrive软件开发gogolang入门到项目实战goproject360duote.compro01 est.go" p1: main.Person p2: *main.Person
从运行结果,我们可以看出p1是值类型,p2是指针类型。
下面看一个传参结构体的例子package main import "fmt" type Person struct { name string } func showPerson(per Person) { fmt.Printf("per: %p ", &per) per.name = "kite" fmt.Printf("per: %v ", per) } func showPerson2(per *Person) { fmt.Printf("per: %p ", per) per.name = "kite" fmt.Printf("per: %v ", per) } func main() { p1 := Person{name: "tom"} fmt.Printf("p1: %p ", &p1) showPerson(p1) fmt.Printf("p1: %v ", p1) fmt.Println("---------------------") p2 := &Person{name: "tom"} fmt.Printf("p2: %p ", p2) showPerson2(p2) fmt.Printf("p2: %v ", p2) }
运行结果[Running] go run "d:SynologyDrive软件开发gogolang入门到项目实战goproject360duote.compro01 est.go" p1: 0xc000050230 per: 0xc000050240 per: {kite} p1: {tom} --------------------- p2: 0xc000050270 per: 0xc000050270 per: &{kite} p2: &{kite}
从运行结果,我们看到p1是值传递,拷贝了副本,地址发生了改变,而p2是指针类型,地址没有改变。方法的值类型和指针类型接收者
值类型和指针类型接收者,本质上和函数传参道理相同。
实例package main import "fmt" type Person struct { name string } func (per Person) showPerson() { fmt.Printf("per: %p ", &per) per.name = "kite" fmt.Printf("per: %v ", per) } func (per *Person) showPerson2() { fmt.Printf("per: %p ", per) per.name = "kite" fmt.Printf("per: %v ", per) } func main() { p1 := Person{name: "tom"} fmt.Printf("p1: %p ", &p1) p1.showPerson() fmt.Printf("p1: %v ", p1) fmt.Println("---------------------") p2 := &Person{name: "tom"} fmt.Printf("p2: %p ", p2) p2.showPerson2() fmt.Printf("p2: %v ", p2) }
运行结果[Running] go run "d:SynologyDrive软件开发gogolang入门到项目实战goproject360duote.compro01 est.go" p1: 0xc000050230 per: 0xc000050240 per: {kite} p1: {tom} --------------------- p2: 0xc000050270 per: 0xc000050270 per: &{kite} p2: &{kite}