Go 语言中的函数

GolangGolangBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

随着项目复杂度的增加,通常会将代码划分为多个函数。这种方法可以提高代码的可读性,便于协作,并允许你快速复用逻辑而无需重复代码。在本实验中,你将学习在 Go 中创建和使用函数的基础知识。你将了解如何定义自己的函数,理解 Go 如何处理参数和返回值,并学习 init 函数和可变参数的使用。

关键主题:

  • 理解什么是函数以及它们的工作原理
  • 在 Go 中声明函数
  • 按值和按引用传递参数
  • 从函数中返回多个值
  • 使用 init 函数设置环境
  • 使用可变参数处理灵活的输入

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go(("Golang")) -.-> go/ErrorHandlingGroup(["Error Handling"]) go/BasicsGroup -.-> go/values("Values") go/BasicsGroup -.-> go/variables("Variables") go/FunctionsandControlFlowGroup -.-> go/for("For") go/FunctionsandControlFlowGroup -.-> go/if_else("If Else") go/FunctionsandControlFlowGroup -.-> go/functions("Functions") go/ErrorHandlingGroup -.-> go/errors("Errors") subgraph Lab Skills go/values -.-> lab-149098{{"Go 语言中的函数"}} go/variables -.-> lab-149098{{"Go 语言中的函数"}} go/for -.-> lab-149098{{"Go 语言中的函数"}} go/if_else -.-> lab-149098{{"Go 语言中的函数"}} go/functions -.-> lab-149098{{"Go 语言中的函数"}} go/errors -.-> lab-149098{{"Go 语言中的函数"}} end

创建并运行一个基础程序

首先,导航到你的项目目录并创建一个 Go 文件:

cd ~/project
touch func.go

使用文本编辑器打开 func.go 并添加以下代码:

package main

import "fmt"

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // 对于第一对数字
    if b1 == 0 {
        fmt.Println("除数不能为 0")
    } else {
        fmt.Println(a1 / b1)
    }

    // 对于第二对数字
    if b2 == 0 {
        fmt.Println("除数不能为 0")
    } else {
        fmt.Println(a2 / b2)
    }
}

这段代码尝试进行两次除法运算,并在除法之前检查除数是否为零。如果除数为零,则打印错误信息。

运行程序:

go run func.go

你应该会看到:

3
除数不能为 0

函数声明

在之前的实验中,无论程序是简单还是复杂,我们都只使用了 main 函数来进行操作。

一个程序只能有一个 main 函数,它是程序的入口点。当我们运行程序时,其他函数会直接或间接地在 main 函数中被调用和执行。

现在让我们来看一下函数的语法:

func functionName(parameters...)(returnValues...){
    code block
}

这里,函数名用于标识函数。函数名遵循以下规则:

  • 它可以由字母、数字和下划线组成。但是,函数名的第一个字符不能是数字。例如,func 3ab(){} 是无效的。
  • 当第一个字母为大写时,它可以被外部包中的代码引用。当第一个字母为小写时,它只能在包内使用。这类似于公共函数和私有函数。

参数列表声明了传递给函数的参数数量和类型:

  • 参数列表可以为空,也可以包含多个参数。

  • 每个参数由参数名和参数类型组成。例如,在下面的参数列表中,我们声明了两个 int 类型的变量。

    func test(a, b int) (res int){}

返回值列表用于返回函数执行后所需的值:

  • 返回值列表与参数列表类似。参数的数量可以是任意值。

  • 通常,返回列表由变量名和变量类型组成,变量名是可选的。

  • 如果只返回一个变量并且只声明了变量类型,则可以省略括号。例如:

    func test(a int, b string) int{}

当参数类型相同时,我们可以使用简写模式。以下两个函数的功能相同:

func test(a, b int, c, d string)(res1, res2 int, res3 string){}

// 简写模式
func test(a, b int, c, d string)(res1, res2 int, res3 string){}

func.go 的内容替换为以下代码:

package main

import "fmt"

func check(divisor int) bool {
    if divisor == 0 {
        fmt.Println("除数不能为 0")
        return false
    }
    return true
}

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // 在除法之前使用 check 函数
    if check(b1) {
        fmt.Println(a1 / b1)
    }
    if check(b2) {
        fmt.Println(a2 / b2)
    }
}

再次运行程序:

go run func.go

你应该会看到相同的输出:

3
除数不能为 0

这次,检查逻辑被封装在 check 函数中,使代码更加简洁且可复用。

使用 init 函数

Go 支持一个在 main 函数之前运行的 init 函数。它通常用于在主程序执行之前设置环境条件或初始化变量。

func.go 的内容替换为以下代码:

package main

import "fmt"

func init() {
    fmt.Println("init 语句")
}

func main() {
    fmt.Println("main 语句")
}

运行程序:

go run func.go

你应该会看到:

init 语句
main 语句

在 Go 中,init 函数具有以下特性:

  • 它没有任何输入参数或返回值。
  • 它不能被其他函数调用。

在同一个代码文件或同一个包中可以有多个 init 函数。它们的执行顺序如下:

  • 在同一个代码文件中,先出现的 init 函数会先执行。
  • 在同一个 package 中,文件名按字母顺序排列,文件名靠前的文件会先执行。例如,如果同一个 package 中包含以下带有 init 函数的文件:
a1.go
a2.go
b1.go

执行顺序将是 a1.goa2.gob1.go,因为 a > b 且 1 < 2。

从函数中返回多个值

Go 允许函数返回多个值。这对于同时执行多个相关计算非常有用。

func.go 的内容替换为以下代码:

package main

import "fmt"

func cal(a, b int) (int, int, int, int) {
    return a + b, a - b, a * b, a % b
}

func main() {
    add, sub, mul, rem := cal(90, 12)
    fmt.Println(add, sub, mul, rem)
}

运行程序:

go run func.go

你应该会看到:

102 78 1080 6

在这里,cal 函数一次性返回了四个值,展示了多返回值如何简化某些任务。

使用可变参数

可变参数允许函数接受数量不定的参数。这在输入大小不固定的场景中可以简化代码。

func.go 的内容替换为以下代码:

package main

import "fmt"

func printX(values ...string) {
    for _, v := range values {
        fmt.Println(v)
    }
}

func main() {
    printX("labex", "labs", "courses")
}

运行程序:

go run func.go

你应该会看到:

labex
labs
courses

printX 函数可以处理任意数量的字符串参数,使其更加灵活且易于使用。

总结

在本实验中,你学习了如何在 Go 中定义和使用函数,包括如何返回多个值以及接受可变数量的参数。你还了解了 init 函数如何在 main 函数之前运行。通过将代码组织成函数,你可以使程序更易于理解、维护和复用。

这些技能是构建模块化、可扩展的 Go 应用程序的基础。随着项目的增长,利用函数来组织代码和逻辑将变得越来越重要。