函数是 Go 程序的基本构建单元。Go 语言中的函数非常灵活,支持多返回值,并且可以为特定的类型定义方法(类似于面向对象中的成员函数)。本章将带你快速掌握函数的定义、调用以及方法的绑定。

示例代码

先看一个完整的可运行示例,展示了普通函数、多返回值以及方法的用法。

 1package main
 2
 3import "fmt"
 4
 5// add 是一个普通函数,接收两个 int 参数,返回一个 int 结果
 6func add(a, b int) int {
 7    return a + b
 8}
 9
10// swap 演示多返回值,交换输入的两个字符串
11func swap(x, y string) (string, string) {
12    return y, x
13}
14
15// 定义一个简单的结构体 User
16type User struct {
17    Name string
18    Age  int
19}
20
21// SayHello 是绑定到 User 结构体的方法
22// (u User) 称为接收者(Receiver)
23func (u User) SayHello() {
24    fmt.Printf("Hello, my name is %s and I am %d years old.\n", u.Name, u.Age)
25}
26
27// 只有指针接收者才能修改结构体内部的值
28func (u *User) Grow() {
29    u.Age++
30}
31
32func main() {
33    // 1. 调用普通函数
34    sum := add(10, 20)
35    fmt.Println("10 + 20 =", sum)
36
37    // 2. 调用多返回值函数
38    a, b := swap("hello", "world")
39    fmt.Println(a, b) // world hello
40
41    // 3. 调用方法
42    user := User{Name: "Hank", Age: 18}
43    user.SayHello()
44    
45    // 调用指针接收者方法修改状态
46    user.Grow()
47    fmt.Printf("Age after grow: %d\n", user.Age) // 19
48}

关键点解释

函数声明

使用 func 关键字。类型在变量名之后,这是 Go 的特色之一。

1func name(param1 type1, param2 type2) returnType {
2    // ...
3}

如果参数类型相同,可以合并写,例如 func add(a, b int)

多返回值

Go 最大的特色之一就是支持多返回值。这在错误处理中非常常用(返回结果 + 错误对象)。 调用时必须接收所有返回值,如果不需要某个值,可以使用下划线 _ 忽略。

方法与接收者

方法其实就是特殊的函数,只是多了一个 接收者 (Receiver)

1func (recv Type) MethodName(params) returnType
  • 值接收者 (u User):调用时会复制一份数据,修改不会影响原对象。
  • 指针接收者 (u *User):传递的是引用,可以修改原对象的值,且避免了大对象的拷贝开销。推荐优先使用指针接收者

小结

  • func 定义函数,类型在后。
  • 支持多返回值,常用 val, err 模式。
  • 方法通过接收者绑定到类型,区分值接收者和指针接收者。

练习题

  1. 编写一个函数 div(a, b int) (int, error),实现除法运算。如果除数为 0,返回错误信息(提示:使用 errors.New)。
  2. User 结构体添加一个 SetAge(age int) 方法,确保能修改用户的年龄。

相关阅读