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

posted @   青柚  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
历史上的今天:
2021-05-26 postgres 删除数据库连接
点击右上角即可分享
微信分享提示