函数是 Go 程序的基本构建单元。Go 语言中的函数非常灵活,支持多返回值,并且可以为特定的类型定义方法(类似于面向对象中的成员函数)。本章将带你快速掌握函数的定义、调用以及方法的绑定。
示例代码
先看一个完整的可运行示例,展示了普通函数、多返回值以及方法的用法。
package main
import "fmt"
// add 是一个普通函数,接收两个 int 参数,返回一个 int 结果
func add(a, b int) int {
return a + b
}
// swap 演示多返回值,交换输入的两个字符串
func swap(x, y string) (string, string) {
return y, x
}
// 定义一个简单的结构体 User
type User struct {
Name string
Age int
}
// SayHello 是绑定到 User 结构体的方法
// (u User) 称为接收者(Receiver)
func (u User) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", u.Name, u.Age)
}
// 只有指针接收者才能修改结构体内部的值
func (u *User) Grow() {
u.Age++
}
func main() {
// 1. 调用普通函数
sum := add(10, 20)
fmt.Println("10 + 20 =", sum)
// 2. 调用多返回值函数
a, b := swap("hello", "world")
fmt.Println(a, b) // world hello
// 3. 调用方法
user := User{Name: "Hank", Age: 18}
user.SayHello()
// 调用指针接收者方法修改状态
user.Grow()
fmt.Printf("Age after grow: %d\n", user.Age) // 19
}关键点解释
函数声明
使用 func 关键字。类型在变量名之后,这是 Go 的特色之一。
func name(param1 type1, param2 type2) returnType {
// ...
}如果参数类型相同,可以合并写,例如 func add(a, b int)。
多返回值
Go 最大的特色之一就是支持多返回值。这在错误处理中非常常用(返回结果 + 错误对象)。
调用时必须接收所有返回值,如果不需要某个值,可以使用下划线 _ 忽略。
方法与接收者
方法其实就是特殊的函数,只是多了一个 接收者 (Receiver)。
func (recv Type) MethodName(params) returnType值接收者 (
u User):调用时会复制一份数据,修改不会影响原对象。指针接收者 (
u *User):传递的是引用,可以修改原对象的值,且避免了大对象的拷贝开销。推荐优先使用指针接收者。
小结
func定义函数,类型在后。支持多返回值,常用
val, err模式。方法通过接收者绑定到类型,区分值接收者和指针接收者。
练习题
编写一个函数
div(a, b int) (int, error),实现除法运算。如果除数为 0,返回错误信息(提示:使用errors.New)。为
User结构体添加一个SetAge(age int)方法,确保能修改用户的年龄。