介绍
随着项目复杂度的增加,通常会将代码划分为多个函数。这种方法可以提高代码的可读性,便于协作,并允许你快速复用逻辑而无需重复代码。在本实验中,你将学习在 Go 中创建和使用函数的基础知识。你将了解如何定义自己的函数,理解 Go 如何处理参数和返回值,并学习 init
函数和可变参数的使用。
关键主题:
- 理解什么是函数以及它们的工作原理
- 在 Go 中声明函数
- 按值和按引用传递参数
- 从函数中返回多个值
- 使用
init
函数设置环境 - 使用可变参数处理灵活的输入
随着项目复杂度的增加,通常会将代码划分为多个函数。这种方法可以提高代码的可读性,便于协作,并允许你快速复用逻辑而无需重复代码。在本实验中,你将学习在 Go 中创建和使用函数的基础知识。你将了解如何定义自己的函数,理解 Go 如何处理参数和返回值,并学习 init
函数和可变参数的使用。
关键主题:
init
函数设置环境首先,导航到你的项目目录并创建一个 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
函数中,使代码更加简洁且可复用。
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.go
、a2.go
、b1.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 应用程序的基础。随着项目的增长,利用函数来组织代码和逻辑将变得越来越重要。