Go语言基础----方法值和方法表达式
概念
- 方法:是为特定类型定义的,只能由该类型调用的函数。
定义:方法是添加了接收者的函数。接收者必须是自定义的 类型。
指针接收者
- 该使用值接收者还是指针接收者,取决于是否现需要修改原始结构体。
- 若不需要修改则使用值,若需要修改则使用指针。
- 若存在指针接收者,则所有方法使用指针接收者。
命名嵌入
- 若结构体匿名嵌入带有方法的结构体时,则在外部结构体可以调用嵌入结构体的方法,并且在调用时只有嵌入的字段会传递给嵌入结构体方法的接收者。
- 当被嵌入结构体与嵌入结构体具有相同名称的方法时,则使用对象.方法名调用被嵌入结构体方法。若想要调用嵌入结构体方法,则使用对象.嵌入结构体名.方法
方法值
package main
import "fmt"
type Dog struct {
name string
}
func (dog Dog) call() {
fmt.Printf("%s: 汪汪\n", dog.name)
}
func (dog *Dog) setName(name string) {
dog.name = name
}
func main() {
dog := Dog{"皮皮"}
m1 := dog.call
fmt.Printf("%T\n", m1)
m1()
dog.setName("小黑")
dog.call()
m1()
pdog := &Dog{"皮皮"}
m2 := pdog.call
fmt.Printf("%T\n", m2)
m2()
pdog.setName("小黑")
pdog.call()
m2()
}
方法表达式
package main
import "fmt"
type Dog struct {
name string
}
func (dog Dog) call() {
fmt.Printf("%s: 汪汪\n", dog.name)
}
func (dog *Dog) setName(name string) {
dog.name = name
}
func main() {
m1 := Dog.call
m2 := (*Dog).setName
fmt.Printf("%T,%T\n", m1, m2)
dog := Dog{"冬冬"}
m1(dog)
m2(&dog, "小黑")
m1(dog)
dog.setName("小白")
m1(dog)
pdog := &Dog{"灰灰"}
m1(*pdog)
m2(pdog, "小黑")
m1(*pdog)
m2(pdog, "小白")
m1(*pdog)
}