func(receiver receiver_type)some_func_name(arguments)return_values
本次我们使用地址空间的角度来剖析实质,强化记忆。
“只有客户发展了,才有我们的生存与发展!”这是创新互联建站的服务宗旨!把网站当作互联网产品,产品思维更注重全局思维、需求分析和迭代思维,在网站建设中就是为了建设一个不仅审美在线,而且实用性极高的网站。创新互联对成都网站建设、成都做网站、网站制作、网站开发、网页设计、网站优化、网络推广、探索永无止境。
值接受者:receiver是struct等值类型。
下面定义了值类型接受者 Person, 尝试使用 Person{}, &Person{}去调用接受者函数。
package main
import "fmt"
type Person struct {
name string
age int
}
func (p Person) say() {
fmt.Printf("I (%p) ma %s, %d years old \n",&p, p.name,p.age)
}
func (p Person) older(){ // 值类型方法接受者:接受者是原类型值的副本
p.age = p.age +1
fmt.Printf("I (%p) am %s, %d years old\n", &p, p.name,p.age)
}
func main() {
p1 := Person{name: "zhangsan", age: 20}
p1.older()
p1.say()
fmt.Printf("I (%p) am %s, %d years old\n",&p1, p1.name,p1.age)
p2 := &Person{ name: "sili", age: 20}
p2.older() // 即使定义的是值类型接受者, 指针类型依旧可以使用,但我们传递进去的还是值类型的副本
p2.say()
fmt.Printf("I (%p) am %s, %d years old\n",p2, p2.name,p2.age)
}
尝试改变p1=Person{},p2=&Person{}的字段值:
I (0xc000098078) am zhangsan, 21 years old
I (0xc000098090) ma zhangsan, 20 years old
I (0xc000098060) am zhangsan, 20 years old
I (0xc0000980c0) am sili, 21 years old
I (0xc0000980d8) ma sili, 20 years old
I (0xc0000980a8) am sili, 20 years old
p1=Person{} 未能修改原p1的字段值;p2=&Person{}也未能修改原p2的字段值。
带来的效果是:对值类型接收者内的字段操作,并不影响原调用者。
方法接收者也可以定义在指针上,任何尝试对指针接收者的修改,会体现到调用者。
package main
import "fmt"
type Person struct{
name string
age int
}
func (p Person) say(){
fmt.Printf("I (%p) am %s, %d years old\n", &p, p.name,p.age)
}
func (p *Person) older(){ // 指针接受者,传递函数内部的是原类型值(指针), 函数内的操作会体现到原指针指向的空间
p.age = p.age +1
fmt.Printf("I (%p) am %s, %d years old\n", p, p.name,p.age)
}
func main() {
p1 := Person{"zhangsan",20}
p1.older() // 虽然定义的是指针接受者,但是值类型依旧可以使用,但是会隐式传入指针值
p1.say()
fmt.Printf("I (%p) am %s, %d years old\n", &p1, p1.name,p1.age)
p2:= &Person{"sili",20}
p2.older()
p2.say()
fmt.Printf("I (%p) am %s, %d years old\n", p2, p2.name,p2.age)
}
尝试改变p1= Person{}, p2=&Person{}字段值
I (0xc000098060) am zhangsan, 21 years old
I (0xc000098078) am zhangsan, 21 years old
I (0xc000098060) am zhangsan, 21 years old
I (0xc000098090) am sili, 21 years old
I (0xc0000980a8) am sili, 21 years old
I (0xc000098090) am sili, 21 years old
p1=Person{} 成功修改字段值,p2=&Person{}也成功修改字段值。
带来的效果:任何对指针接收者的修改会体现到 原调用者。
接上例子:
Person.say(p1)
(*Person).older(p2)
依旧是 值类型/指针类型方法接收者的效果:
I (0xc0000040d8) am zhangsan, 21 years old
I (0xc0000040a8) am sili, 22 years old
这种姿势相对于面向对象的接收者不常见。
func (p Person) printName() Person{
fmt.Printf("Name:%s", p.Name)
return p
}
type myFloat float64
func (m myFloat) ceil() float64 {
return math.Ceil(float64(m))
}
本文题目:聊一聊Golang方法接收者
分享URL:http://www.csdahua.cn/qtweb/news34/53334.html
成都网站优化推广公司_创新互联,为您提供网页设计公司、标签优化、网站内链、用户体验、静态网站、网站设计公司
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网