程序代码
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