在Go语言中,函数和方法都是用来封装逻辑的基本单元,但两者的定义方式有明显不同。函数独立于任何类型,而方法必须依附于某个自定义类型。理解它们的写法,是写好Go程序的基础。

一、如何定义函数
Go语言使用func关键字定义函数,基本格式为:func 函数名(参数列表) 返回值列表 { 函数体 }。函数可以有多个参数和多个返回值,参数和返回值都需要声明类型。
package main
import "fmt"
// 定义一个普通函数,计算两个整数之和
func add(a int, b int) int {
return a + b
}
// 定义带多个返回值的函数
func divmod(a int, b int) (int, int) {
return a / b, a % b
}
func main() {
sum := add(3, 5)
fmt.Println(sum)
q, r := divmod(10, 3)
fmt.Println(q, r)
}
二、如何定义方法
方法是在func关键字和函数名之间增加一个接收者(receiver),接收者可以是值类型或指针类型。方法被绑定到接收者类型上,只能通过该类型的实例来调用。
package main
import "fmt"
// 定义一个结构体类型
type Rectangle struct {
Width float64
Height float64
}
// 值接收者方法:计算面积
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 指针接收者方法:修改宽度
func (r *Rectangle) SetWidth(w float64) {
r.Width = w
}
func main() {
rect := Rectangle{Width: 3, Height: 4}
fmt.Println(rect.Area())
rect.SetWidth(5)
fmt.Println(rect.Area())
}
值接收者与指针接收者的区别
- 值接收者:方法内对接收者的修改不会影响原实例。
- 指针接收者:方法内可以通过指针修改原实例的字段。
- 如果类型较大或需要修改自身状态,通常使用指针接收者。
三、函数与方法的对比
| 对比项 | 函数 | 方法 |
|---|---|---|
| 定义位置 | 独立定义 | 绑定到类型 |
| 调用方式 | 直接通过函数名 | 通过类型实例 |
| 接收者 | 无 | 有(值或指针) |
四、小结
在Golang中,定义函数使用func 名称(参数) 返回值的形式;定义方法则要在函数名前加接收者,如func (t Type) 名称(参数) 返回值。合理选择函数和方法来组织代码,可以让业务逻辑更清楚,也更符合Go语言的设计习惯。