Go语言中函数 vs 方法

发布于:2025-05-20 ⋅ 阅读:(15) ⋅ 点赞:(0)

函数(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 string
    Age  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 main

import "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() 更面向对象,也更清晰语义。


网站公告

今日签到

点亮在社区的每一天
去签到