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 @ 2022-05-26 23:12  青柚  阅读(62)  评论(0编辑  收藏  举报