Go方法定义与声明
Go方法是与特定类型关联的函数,通过接收者调用。
方法基本语法
定义方法
Go
type User struct {
Name string
Age int
}
// 方法定义:接收者 + 函数
func (u User) GetName() string {
return u.Name
}
// 调用方法
u := User{Name: "Tom", Age: 25}
name := u.GetName()
fmt.Println(name) // Tom
接收者语法
Go
// 接收者写在func后
func (接收者 类型) 方法名(参数) 返回值 {
// 方法体
}
// 示例
func (u User) SetAge(age int) {
u.Age = age // 值接收者:修改无效
}
func (u *User) SetAge(age int) {
u.Age = age // 指针接收者:修改有效
}
值接收者与指针接收者
值接收者
Go
func (u User) GetName() string {
return u.Name // 读取有效
}
func (u User) SetAge(age int) {
u.Age = age // 修改无效(操作副本)
}
u := User{Name: "Tom"}
u.SetAge(30)
fmt.Println(u.Age) // 25(未改变)
指针接收者
Go
func (u *User) SetAge(age int) {
u.Age = age // 修改有效(操作原值)
}
u := User{Name: "Tom"}
u.SetAge(30) // 自动转换为(&u).SetAge(30)
fmt.Println(u.Age) // 30(已改变)
需修改接收者时使用指针接收者。
方法调用
值调用方法
Go
u := User{Name: "Tom"}
// 值调用值接收者方法
u.GetName() // OK
// 值调用指针接收者方法(自动转换)
u.SetAge(30) // 自动转换为(&u).SetAge(30)
指针调用方法
Go
u := &User{Name: "Tom"}
// 指针调用指针接收者方法
u.SetAge(30) // OK
// 指针调用值接收者方法(自动解引用)
u.GetName() // 自动转换为(*u).GetName()
Go自动处理值/指针调用方法的转换。
方法与函数区别
语法对比
Go
// 函数:独立定义
func GetName(u User) string {
return u.Name
}
// 方法:绑定类型
func (u User) GetName() string {
return u.Name
}
// 调用方式
GetName(u) // 函数调用
u.GetName() // 方法调用
方法集规则
| 接收者类型 | 可调用者 | 说明 |
|---|---|---|
| 值接收者 | 值T和指针*T | 都可调用 |
| 指针接收者 | 值T和指针*T | 都可调用(自动转换) |
方法可见性
导出规则
Go
type User struct {
name string // 小写,私有
Name string // 大写,公开
}
// 方法导出规则同样适用
func (u User) GetName() string { // 大写,公开
return u.Name
}
func (u User) getInternal() string { // 小写,私有
return u.name
}
方法首字母大写可导出,小写私有。
方法定义示例
Go
type Counter struct {
value int
}
// 值接收者:读取
func (c Counter) Value() int {
return c.value
}
// 指针接收者:修改
func (c *Counter) Increment() {
c.value++
}
func (c *Counter) Reset() {
c.value = 0
}
func main() {
c := Counter{value: 10}
fmt.Println(c.Value()) // 10
c.Increment()
fmt.Println(c.Value()) // 11
c.Reset()
fmt.Println(c.Value()) // 0
}
要点总结
- 方法使用接收者绑定到类型
- 值接收者操作副本,修改无效
- 指针接收者操作原值,修改有效
- Go自动处理值/指针调用转换
- 方法首字母大写导出,小写私有
- 方法签名必须包含接收者
- 方法与函数:方法绑定类型,函数独立
- 选择规则:需修改用指针,只读用值
📝 发现内容有误?点击此处直接编辑