引入

代码里有些逻辑反复出现,复制粘贴又难维护。函数把一段代码封装起来,需要时再调用,给个名字就能复用。Go 的函数支持多参数、多返回值,配合命名返回值和 _ 忽略值,写起来既灵活又干净。

正文

定义

定义

函数是一段可复用的代码块,接收输入(参数),执行后产出结果(返回值)。Go 用 func 关键字声明函数,支持多参数多返回值,参数和返回值都必须声明类型。

语法

// 基本函数声明
func 函数名(参数名 参数类型) 返回值类型 {
    // 函数体
    return 返回值
}
 
// 多参数
func add(a int, b int) int {
    return a + b
}
 
// 参数类型相同可简写
func add(a, b int) int {
    return a + b
}
 
// 多返回值
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("除数不能为 0")
    }
    return a / b, nil
}

例子

无参无返回值

func sayHello() {
    fmt.Println("Hello, Go!")
}
 
func main() {
    sayHello()
}

最简单的函数,不接受参数也不返回结果,纯粹执行一段逻辑。

带参数

func greet(name string) {
    fmt.Println("Hello,", name)
}
 
func main() {
    greet("Alice")
}

调用函数时传进去的数据叫实参,函数定义里的叫形参。Go 的参数必须声明类型。

同类型参数简写

func add(a, b int) int {
    return a + b
}

相邻参数类型相同时,只在最后一个参数后面写类型,前面的省略。

多返回值

func swap(a, b string) (string, string) {
    return b, a
}
 
func main() {
    x, y := swap("hello", "world")
    fmt.Println(x, y) // world hello
}

函数执行后交回来的结果叫返回值,Go 支持多返回值,一次拿回多个结果。

命名返回值

func split(sum int) (x, y int) {
    x = sum / 10
    y = sum % 10
    return
}

返回值声明时可以起名字,函数体里直接给命名返回值赋值,return 不带参数也能返回。

_ 忽略返回值

func getUser() (string, int) {
    return "Alice", 25
}
 
func main() {
    name, _ := getUser()
    fmt.Println(name)
}

不需要的返回值用 _ 忽略,Go 要求返回值必须被接收或显式忽略。

空白标识符 _ 忽略中间值

result, _, err := doSomething()
if err != nil {
    fmt.Println("出错了:", err)
}

多返回值里只关心某几个值时,其余用 _ 丢掉。

常见写法

写法说明
func f()无参无返回值
func f(a, b int) int同类型参数简写
func f() (int, error)多返回值
func f() (x, y int)命名返回值
x, _ := f()忽略某个返回值
func f(a int, b string)不同类型参数

特点

  • Go 函数用 func 声明,参数和返回值必须写类型
  • 支持多返回值,常见模式是 (结果, error)
  • 参数类型相同时可以简写a, b int
  • 命名返回值可以省略 return 后面的值,但不推荐在长函数里用
  • _ 用来忽略不需要的返回值,避免编译报错
  • Go 函数不支持默认参数函数重载
  • 参数传递是值传递,函数内修改参数不影响原始变量

理解

函数就是给一段代码起了个名字,想用的时候喊一声就行。Go 的函数最特别的地方是多返回值,配合 error 做错误处理非常自然。没有默认参数和函数重载一开始会觉得不方便,但习惯了反而觉得代码更清晰——每个调用都写得明明白白。

引出

基本函数搞清楚了,接下来看看函数更高级的用法——匿名函数、闭包、函数作为值传递。这些都是 Go 函数进阶 的内容。