方法
- 只能未当前包含命令类型定义方法
- 参数receiver可任意命名。如方法中未曾使用,可省略参数名
- 参数receiver类型可以是T或者是*T。基类型T不能是接口或指针
- 不支持方法重载,receiver知识参数签名的组成部分
- 可用实例value或pointer调用全部方法,编译器自动转换
一个方法就是一个包含了接收者的函数,接收者可以是命名类型或者结构体类型的一个值或者是一个指针
所有给定类型的方法属于该类型的方法集
```go //当接收者不是一个指针的时候,该方法操作对应接收者的值的副本(意思就是即使使用了指针调用函数,但是函数的接收者是值类型)所以函数内部操作还是对副本的操作,而不是指针操作 package main
import “fmt”
type User struct { Name string Email string }
func (u User) Notify() { fmt.Printf(“%v: %v \n”, u.Name, u.Email) } func main() { //值类型方法调用 user := User{Name: “Golang”, Email: “Goland.com”} user.Notify()
//指针类型调用方法u := &User{Name: "Golang", Email: "Goland"}u.Notify()
}
//当接收者是一个指针的时候,即使用值类型调用那么函数内部也是对指针的操作。
func (u *User) Notify() { fmt.Printf(“%v: %v \n”, u.Name, u.Email) } func main() { //值类型方法调用 user := User{Name: “Golang”, Email: “Goland.com”} user.Notify()
//指针类型调用方法u := &User{Name: "Golang", Email: "Goland"}u.Notify()
}
<a name="9d31d591"></a>#### receiver T 和 `*T` 的差别> ```gopackage mainimport "fmt"type User struct {Name stringEmail string}func (u User) Notify_1() {fmt.Printf("Value: %p\n", &u)}func (u *User) Notify_2() {fmt.Printf("Pointer: %p\n", u)}func main() {user := User{Name: "张三", Email: "Goland.com"}//0xc0000503c0var u = &userfmt.Printf("u: %p\n", u)//0xc000050400 传入的receiver 接收者实参 发生了值拷贝user.Notify_1()//0xc0000503c0 传入的receiver 接收者实参 还是使用的指针值user.Notify_2()//0xc000050420 传入的receiver 接收者实参 发生了值拷贝u.Notify_1()// 传入的receiver 接收者实参 还是使用的指针值u.Notify_2()}
普通函数与方法的区别
- 对于普通函数接收者是值类型时,不能直接将指针类型的数据直接传递 反过来也一样
- 对于方法如struct方法,接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样可以
