【go语言】方法与接收者

Go 语言没有类,但可以把函数绑定到某个类型上,这样的函数称为方法。方法的本质是带接收者的函数,接收者写在 func 和方法名之间。

1. 值接收者与指针接收者

type Person struct {
    name string
    age  int
}

// 值接收者:操作的是副本
func (p Person) GetName() string {
    return p.name
}

// 指针接收者:可以修改原对象
func (p *Person) SetAge(age int) {
    p.age = age
}

func main() {
    person := Person{"张三", 18}
    person.SetAge(20)
    fmt.Println(person.GetName(), person.age) // 张三 20
}

选择接收者的原则:需要修改接收者的值,或者结构体较大想避免拷贝时,用指针接收者;只读的小结构体可以用值接收者。同一个类型的方法接收者类型尽量保持一致。

2. 方法集与调用便利性

声明为指针接收者的方法,值类型的变量也能直接调用,Go 会自动取地址(前提是变量可寻址):

p := Person{"张三", 18}
p.SetAge(20) // 等价于 (&p).SetAge(20)

3. 方法和函数的区别

方法必须有接收者,函数没有。方法通过类型的值或指针调用,函数直接按名调用。逻辑上属于某个类型的操作写成方法更自然,通用工具逻辑写成函数即可。

4. 匿名嵌套与方法提升

结构体嵌套另一个结构体后,被嵌套类型的方法会被「提升」,外层结构体可以直接调用:

type Animal struct{}

func (a Animal) Walk() { fmt.Println("走路") }

type Dog struct {
    Animal // 匿名嵌套
}

func main() {
    d := Dog{}
    d.Walk() // Dog 直接拥有 Walk 方法
}
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容