Go语言中函数 vs 方法
函数(Function):不属于任何类型,是全局可调用的。
方法(Method):绑定在某个类型上的函数,调用时依赖于这个类型的值或指针。
一、函数(Function)
func 函数名(参数列表) 返回类型 {// 函数体
}
func Add(a int, b int) int {return a + b
}
result := Add(3, 4) // => 7
✅ 这个函数是“独立”的,跟任何结构体或类型无关。
二、方法(Method)
func (变量名 类型名) 方法名(参数列表) 返回类型 {// 方法体
}
type Person struct {Name stringAge int
}// 方法 SayHello 绑定在 Person 类型上
func (p Person) SayHello() string {return "Hello, " + p.Name
}
p := Person{Name: "Tom"}
fmt.Println(p.SayHello()) // 输出:Hello, Tom
三、指针接收者 vs 值接收者
Go 方法接收者可以是值也可以是指针,区别在于是否能修改原对象。
值接收者(不改变原值):
func (p Person) ChangeName(newName string) {p.Name = newName // 修改的是副本
}p := Person{Name: "Tom"}
p.ChangeName("Jerry")
fmt.Println(p.Name) // 还是 Tom
指针接收者(能修改原值):
func (p *Person) ChangeName(newName string) {p.Name = newName // 修改的是原对象
}
p := Person{Name: "Tom"}
p.ChangeName("Jerry")
fmt.Println(p.Name) // 是 Jerry
比较项 | 函数(Function) | 方法(Method) |
---|---|---|
是否有接收者 | ❌ 没有 | ✅ 有((变量名 类型名) ) |
是否绑定类型 | ❌ 否 | ✅ 是 |
是否能被结构体调用 | ❌ 不能 | ✅ 可以(结构体.方法()) |
用于封装对象逻辑 | 🚫 不适合 | ✅ 很适合,符合 OOP 风格 |
语法示例 | func DoSomething() | func (p *Person) DoSomething() |
package mainimport "fmt"type Circle struct {Radius float64
}// 普通函数
func Area(c Circle) float64 {return 3.14 * c.Radius * c.Radius
}// 方法(值接收者)
func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}func main() {c := Circle{Radius: 5}// 调用函数fmt.Println(Area(c)) // 输出:78.5// 调用方法fmt.Println(c.Area()) // 输出:78.5
}
✅ 结果一样,但 c.Area() 更面向对象,也更清晰语义。