flyfei

函数

1. 语法讲解

Go语言函数的基本语法:

func 函数名(参数列表) 返回值列表 {
    // 函数体
    return 返回值
}

特点

匿名函数与闭包

// 匿名函数
func(参数列表) 返回值列表 {
    // 函数体
}

// 闭包:函数内部定义的函数,可以访问外部函数的变量

2. 应用场景

3. 编程实例

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)
}

4. 其他用法

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)
}

5. 课时总结

本课时我们学习了: