Golang 值接受者类型方法和指针接收者类型方法的区别
程序代码
package main
//总结:值接收者使用值的副本来调用方法,而指针接收者使用实际值来调用方法!
import (
"fmt"
)
//声明一个用户结构体
type user struct{
name string
email string
}
//声明值类型接受者方法
func (u user) notify(){
fmt.Println(u.email,u.name)
}
//声明指针类型接受者方法 修改email属性
func (u *user) changeEmail(email string){
u.email = email
}
//声明值类型接受者方法 修改email属性
func (u user) chem(email string) {
u.email = email
}
func main(){
nill := user{"123","1@qq"}
nill.notify()
lisa := &user{"lisab","123@qq.com"}
lisa.notify()
//一个值类型的结构体方法 试图修改一个地址类型的结构体的内部属性 不生效! 他修改的应该是指向这个地址的副本的值
lisa.chem("使用指针的值来调用值接收者声明的方法")
lisa.notify() //输出 “123@qq.com lisab”
//以下两种生效
lisa.changeEmail("指针类型的值调用指针接收者声明的方法")
lisa.notify()
nill.changeEmail("使用值来调用指针接收者声明的方法") // 等于 (&nill).changeEmail("...")
nill.notify()
}
输出结果:
D:\GO\study\demo27>go run main.go
1@qq 123
123@qq.com lisab
123@qq.com lisab
指针类型的值调用指针接收者声明的方法 lisab
使用值来调用指针接收者声明的方法 123
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2021-05-26 postgres 删除数据库连接