Go语言没有传统的 class
,为了让函数和结构体能够关联,Go引入了“方法”的概念。
当普通函数添加了接收者(receiver)后,就变成了方法。
一、函数和方法示例
// 普通函数
func Check(s string) string {
return s
}
// 方法,有了Receiver变成方法类型
func (Receiver) Check(s string) string {
return s
}
二、方法使用
package main
import "fmt"
type Address struct {
City string
}
type Person struct {
Name string
Age int
Address // 匿名成员,类型嵌入
}
// 普通函数
func Check(s string) string {
return s
}
// 带有指针接收者的方法
func (p *Person) init(s string) {
p.Name = s
p.Age = 19
}
func main() {
// 创建一个指针类型的 Person 实例
p1 := &Person{}
p1.init("xinglujianzhi") // p1.init //所属关系,init方法属于p1的类型
// 打印 Person 实例
fmt.Println(*p1) // 解引用 p1 打印其值
}
三、总结
在 Go 中,无论接收者是值类型还是指针类型,都可以通过实例(值)或指针来调用方法。Go 通过语法糖来简化调用方式,但内部的处理还是要根据接收者的类型来确定。
- 接收者是值类型 (p1):
- 如果接收者是值类型 p1,那么方法调用时,会将实例的副本传递给方法。这意味着方法内对接收者字段的修改不会影响原始实例。
- 接收者是指针类型 (*p1):
- 如果接收者是指针类型
*p1
,则方法调用时传递的是实例的地址(指针)。方法内对接收者的修改会直接影响原始实例。
- 如果接收者是指针类型
语法糖:
Go 提供了语法糖,即你可以用值来调用指针类型的接收者方法,反之亦然。Go 会自动为你进行地址的转换(即自动取指针或解引用)。