Go语言函数的基本语法:
func 函数名(参数列表) 返回值列表 {
// 函数体
return 返回值
}
特点:
匿名函数与闭包:
// 匿名函数
func(参数列表) 返回值列表 {
// 函数体
}
// 闭包:函数内部定义的函数,可以访问外部函数的变量
package main
import (
"errors"
"fmt"
"strings"
)
// 用户注册验证函数
func validateUser(username, password string) (bool, error) {
if len(username) < 3 {
return false, errors.New("用户名长度不能少于3个字符")
}
if len(password) < 6 {
return false, errors.New("密码长度不能少于6个字符")
}
return true, nil
}
// 多返回值函数:数据库查询模拟
func queryUser(userId int) (string, int, error) {
if userId <= 0 {
return "", 0, errors.New("无效的用户ID")
}
// 模拟数据库查询
users := map[int]struct {
name string
age int
}{
1: {"张三", 25},
2: {"李四", 30},
}
if user, ok := users[userId]; ok {
return user.name, user.age, nil
}
return "", 0, errors.New("用户不存在")
}
// 闭包:计数器
func createCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
// 用户注册验证
valid, err := validateUser("ab", "123456")
if err != nil {
fmt.Println("验证失败:", err)
} else {
fmt.Println("验证通过:", valid)
}
// 多返回值
name, age, err := queryUser(1)
if err != nil {
fmt.Println("查询失败:", err)
} else {
fmt.Printf("用户: %s, 年龄: %d\n", name, age)
}
// 闭包使用
counter := createCounter()
fmt.Println("计数:", counter()) // 1
fmt.Println("计数:", counter()) // 2
// 匿名函数:字符串处理
strs := []string{"apple", "Banana", "cherry"}
fmt.Println("原始:", strs)
// 使用匿名函数排序(忽略大小写)
sort.Slice(strs, func(i, j int) bool {
return strings.ToLower(strs[i]) < strings.ToLower(strs[j])
})
fmt.Println("排序后:", strs)
}
package main
import (
"fmt"
"strings"
)
// 定义函数类型
type StringProcessor func(string) string
// 接收函数作为参数
func processString(s string, processor StringProcessor) string {
return processor(s)
}
func main() {
// 函数作为参数传递
toUpper := func(s string) string {
return strings.ToUpper(s)
}
result := processString("hello go", toUpper)
fmt.Println(result) // HELLO GO
// 直接传递匿名函数
result2 := processString(" hello ", func(s string) string {
return strings.TrimSpace(s)
})
fmt.Printf("'%s'\n", result2) // 'hello'
}
package main
import "fmt"
// 可变参数函数:计算总和
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
// 可变参数函数:格式化打印
func formatPrint(format string, args ...interface{}) {
fmt.Printf(format, args...)
}
func main() {
fmt.Println("总和:", sum(1, 2, 3, 4, 5))
fmt.Println("总和:", sum(10, 20))
formatPrint("用户: %s, 年龄: %d, 分数: %.2f\n",
"张三", 25, 89.5)
}
本课时我们学习了: