全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-14 5 分钟 ✍️ juanwangdev

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自动处理值/指针调用转换
  • 方法首字母大写导出,小写私有
  • 方法签名必须包含接收者
  • 方法与函数:方法绑定类型,函数独立
  • 选择规则:需修改用指针,只读用值

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go接口的底层值
下一篇 → Go方法集
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库