Go语言方法
Go语言方法
两种接收者
Go语言方法有他的接收者,如下代码
package main
import "fmt"
type A struct {
name string
}
func (a A) Name() string {
a.name = "hi" + a.name
return a.name
}
func main() {
a := A{
name:"ymk",
}
fmt.Println(a.Name())
fmt.Println(A.Name(a))
fmt.Println(a.name)
这段代码中,Name方法的接收者是A结构体的变量。方法接收者其实就是方法的一个参数,所以这里a.Name()与A.Name(a)是等价的运行后,的效果如下
PS D:\chengxu\test\go> go run .\main.go
hiymk
hiymk
ymk
因为这里a是值传递,因此在Name方法里改变a.name并不会影响实际的a。
如果将方法改写,这里方法的接收者是指针值,因此a会受影响
func (a *A) Name() string {
a.name = "hi" + a.name
return a.name
}
func main() {
a := A{
name:"ymk",
}
fmt.Println(a.Name())
fmt.Println((*A).Name(&a))
fmt.Println(a.name)
}
PS D:\chengxu\test\go> go run .\main.go
hiymk
hihiymk
hihiymk
将一个类型的方法赋给一个变量
type A struct {
name string
}
func (a A) GetName() string {
return a.name
}
func main() {
a := A{name:"ymk"}
f1 := A.GetName
fmt.Println(f1(a))
f2 := a.GetName
a.name = "yyy"
fmt.Println(f2())
}
执行结果
PS D:\chengxu\test\go> go run .\main.go
ymk
ymk
这里的f1是一个方法表达式,f2是一个方法变量,并且把a捕获进去形成了闭包。他们本质上都是function value