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









暂无评论内容