golang 方法method
更新时间:2023-11-21什么是方法
方法是指在一个类型上定义的函数,由于 Go 语言是一种面向对象编程语言,因此必然需要对已有的类型进行扩展,以实现更多的功能。方法可以绑定在一个类型上,当该类型的值调用方法时,该类型的值就像是 "自己调用了自己"。
type Person struct {
Name string
Age int
}
func (p Person) Introduce() {
fmt.Printf("My name is %s. I'm %d year(s) old.\n", p.Name, p.Age)
}
func main() {
p := Person{"Jack", 26}
p.Introduce() // My name is Jack. I'm 26 year(s) old.
}
方法及其接收者
方法定义时需要指定接收者(receiver),接收者就是该方法所绑定的类型的值。当该类型的值调用方法时,就会在方法调用的前面自动插入接收者,形成一个语法糖。
type IntSlice []int
func (s IntSlice) Sum() int {
sum := 0
for _, v := range s {
sum += v
}
return sum
}
func main() {
nums := IntSlice{1, 2, 3, 4, 5}
fmt.Println(nums.Sum()) // 15
}
值接收者 VS 指针接收者
方法的接收者可以是值类型或指针类型,不同的接收者会导致不同的方法调用方式。需要选择合适的接收者类型,以此平衡内存占用和操作的灵活性。
type Person struct {
Name string
Age int
}
func (p Person) GetAge() int {
return p.Age
}
func (p *Person) SetAge(age int) {
p.Age = age
}
func main() {
p := Person{"Jack", 26}
fmt.Println(p.GetAge()) // 26
p.SetAge(27)
fmt.Println(p.GetAge()) // 27
}
嵌入类型方法
嵌入类型是一种 Go 语言特性,它可以有效地实现组合复用。当一个类型嵌入另一个类型时,它自动拥有了被嵌入类型的所有方法。这些方法就好像是被嵌入类型的方法一样,只不过它们的接受者变成了嵌入类型的实例。
type Animal struct {
Name string
}
func (a *Animal) SayName() {
fmt.Printf("My name is %s.\n", a.Name)
}
type Dog struct {
*Animal
Age int
}
func main() {
d := &Dog{&Animal{"Lucy"}, 3}
d.SayName() // My name is Lucy.
}