函数是 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 模式。

  • 方法通过接收者绑定到类型,区分值接收者和指针接收者。

练习题

  1. 编写一个函数 div(a, b int) (int, error),实现除法运算。如果除数为 0,返回错误信息(提示:使用 errors.New)。

  2. User 结构体添加一个 SetAge(age int) 方法,确保能修改用户的年龄。


相关阅读