c语言编程笔录

首页 >   > 笔记大全

笔记大全

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.
}