函数定义

函数是 Go 语言的基本构建块。本章将详细介绍如何定义和使用函数。

什么是函数?

函数是一段可重复使用的代码块,用于执行特定任务。

函数结构示意:

┌─────────────────────────────────────────────┐
│  func 函数名(参数列表) (返回值列表) {        │
│      // 函数体                              │
│      return 返回值                          │
│  }                                          │
└─────────────────────────────────────────────┘

函数声明

基本语法

func 函数名(参数列表) (返回值列表) {
    // 函数体
}

无参数无返回值

package main

import "fmt"

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

func main() {
    sayHello()
}

有参数无返回值

package main

import "fmt"

func greet(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

func main() {
    greet("张三")
}

有参数有返回值

package main

import "fmt"

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

func main() {
    result := add(10, 20)
    fmt.Printf("10 + 20 = %d\n", result)
}

多返回值

package main

import "fmt"

func divide(a, b int) (int, int) {
    quotient := a / b
    remainder := a % b
    return quotient, remainder
}

func main() {
    q, r := divide(10, 3)
    fmt.Printf("商: %d, 余数: %d\n", q, r)
}

参数

单个参数

func printNumber(n int) {
    fmt.Println(n)
}

多个参数

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

相同类型参数简写

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

可变参数

package main

import "fmt"

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    fmt.Printf("sum(1, 2) = %d\n", sum(1, 2))
    fmt.Printf("sum(1, 2, 3) = %d\n", sum(1, 2, 3))
    fmt.Printf("sum(1, 2, 3, 4, 5) = %d\n", sum(1, 2, 3, 4, 5))

    nums := []int{1, 2, 3, 4, 5}
    fmt.Printf("sum(nums...) = %d\n", sum(nums...))
}

参数传递方式

值传递:

package main

import "fmt"

func modifyValue(n int) {
    n = 100
}

func main() {
    x := 10
    modifyValue(x)
    fmt.Printf("x = %d\n", x)
}

指针传递:

package main

import "fmt"

func modifyPointer(n *int) {
    *n = 100
}

func main() {
    x := 10
    modifyPointer(&x)
    fmt.Printf("x = %d\n", x)
}

返回值

单返回值

func square(n int) int {
    return n * n
}

多返回值

func swap(a, b int) (int, int) {
    return b, a
}

命名返回值

package main

import "fmt"

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return
}

func main() {
    q, r := divide(10, 3)
    fmt.Printf("商: %d, 余数: %d\n", q, r)
}

空白标识符

忽略不需要的返回值:

package main

import "fmt"

func getName() (string, string) {
    return "张", "三"
}

func main() {
    firstName, _ := getName()
    fmt.Printf("姓: %s\n", firstName)
}

函数类型

函数也是一种类型,可以赋值给变量:

package main

import "fmt"

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

func main() {
    var f func(int, int) int = add

    result := f(10, 20)
    fmt.Printf("结果: %d\n", result)
}

匿名函数

package main

import "fmt"

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

    result := add(10, 20)
    fmt.Printf("结果: %d\n", result)

    result2 := func(a, b int) int {
        return a * b
    }(10, 20)
    fmt.Printf("立即执行结果: %d\n", result2)
}

递归函数

package main

import "fmt"

func factorial(n int) int {
    if n <= 1 {
        return 1
    }
    return n * factorial(n-1)
}

func fibonacci(n int) int {
    if n <= 1 {
        return n
    }
    return fibonacci(n-1) + fibonacci(n-2)
}

func main() {
    fmt.Printf("5! = %d\n", factorial(5))

    fmt.Print("斐波那契数列前 10 项: ")
    for i := 0; i < 10; i++ {
        fmt.Printf("%d ", fibonacci(i))
    }
    fmt.Println()
}

defer 语句

defer 用于延迟执行,常用于资源清理:

package main

import "fmt"

func main() {
    fmt.Println("开始")
    defer fmt.Println("延迟执行 1")
    defer fmt.Println("延迟执行 2")
    fmt.Println("结束")
}

输出:

开始
结束
延迟执行 2
延迟执行 1

defer 实际应用

package main

import (
    "fmt"
    "os"
)

func readFile() {
    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("打开文件失败")
        return
    }
    defer file.Close()

    fmt.Println("读取文件...")
}

func main() {
    readFile()
}

init 函数

init 函数在包初始化时自动执行:

package main

import "fmt"

var name string

func init() {
    name = "张三"
    fmt.Println("init 函数执行")
}

func main() {
    fmt.Printf("name: %s\n", name)
}

总结

本章学习了 Go 语言的函数定义:

知识点说明
声明func 名称(参数) (返回值) { }
多返回值Go 支持多返回值
命名返回值可以为返回值命名
可变参数...类型 接收任意数量参数
匿名函数没有名称的函数
递归函数调用自身
defer延迟执行