函数是 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 用于延迟执行,常用于资源清理:
package main
import "fmt"
func main() {
fmt.Println("开始")
defer fmt.Println("延迟执行 1")
defer fmt.Println("延迟执行 2")
fmt.Println("结束")
}
输出:
开始
结束
延迟执行 2
延迟执行 1
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 函数在包初始化时自动执行:
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 | 延迟执行 |