1.8 函数
函数定义与调用
go
package main
import "fmt"
// 基本函数
func add(a int, b int) int {
return a + b
}
// 简洁参数类型
func multiply(a, b int) int {
return a * b
}
// 无返回值
func printSum(a, b int) {
fmt.Println(a + b)
}
// 无参数
func sayHello() {
fmt.Println("Hello!")
}
func main() {
result := add(3, 5)
fmt.Println(result) // 8
printSum(10, 20)
sayHello()
}多返回值
go
package main
import (
"errors"
"fmt"
)
// 返回两个值
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除数不能为 0")
}
return a / b, nil
}
// 命名返回值
func calculate(a, b int) (sum, product int) {
sum = a + b
product = a * b
return // 裸返回
}
func main() {
// 接收所有返回值
result, err := divide(10, 2)
if err != nil {
fmt.Println("错误:", err)
return
}
// 忽略某个返回值
val, _ := divide(10, 0)
// 命名返回值
s, p := calculate(3, 4)
fmt.Println(s, p)
}可变参数
go
package main
import "fmt"
// 可变参数函数
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(sum()) // 0
fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(1, 2, 3, 4, 5)) // 15
// 切片展开
nums := []int{1, 2, 3, 4}
fmt.Println(sum(nums...)) // 10
}匿名函数
go
package main
import "fmt"
func main() {
// 赋值给变量
add := func(a, b int) int {
return a + b
}
fmt.Println(add(3, 5)) // 8
// 立即执行
func() {
fmt.Println("立即执行")
}()
// 作为函数参数
numbers := []int{1, 2, 3}
process(numbers, func(n int) int {
return n * 2
})
// 作为返回值
multiplier := makeMultiplier(3)
fmt.Println(multiplier(5)) // 15
}
func process(nums []int, transform func(int) int) {
for i, n := range nums {
nums[i] = transform(n)
}
}
func makeMultiplier(factor int) func(int) int {
return func(n int) int {
return n * factor
}
}闭包与作用域
go
package main
import "fmt"
func main() {
// 闭包基础
counter := func() func() int {
count := 0
return func() int {
count++
return count
}
}()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2
fmt.Println(counter()) // 3
// 闭包捕获引用
x := 10
f := func() {
fmt.Println(x)
}
x = 20
f() // 输出 20
// 闭包陷阱
// 错误示例
var funcs []func()
for i := 0; i < 3; i++ {
funcs = append(funcs, func() {
fmt.Println(i) // 都输出 3
})
}
// 正确示例
var funcs2 []func()
for i := 0; i < 3; i++ {
i := i // 创建新变量
funcs2 = append(funcs2, func() {
fmt.Println(i) // 输出 0, 1, 2
})
}
}