Skip to content

常用函数

https://pkg.go.dev/builtin 如果访问不了 https://pkg.go.dev 可以使用国内镜像:

函数说明
append(slice, elems)向切片末尾追加元素(可多个),返回新切片;若切片容量不足会自动扩容
cap(v)返回容器的容量:切片/数组返回最大可容纳元素数,通道返回缓冲区容量
clear(t)清空容器内容:切片置零长度(保留容量),map清空所有键值对,通道无操作
close(c)关闭通道(仅发送方调用),关闭后无法发送数据,但可接收剩余数据
complex(r, i)创建复数:r 为实部,i 为虚部,返回 complex128 类型复数
copy(dst, src)将 src 切片数据复制到 dst 切片,返回实际复制的元素个数(取两者长度最小值)
delete(m, key)删除 map 中指定 key 对应的键值对;若 key 不存在,无任何副作用
imag(c)返回复数 c 的虚部,类型为 float64
len(v)返回容器的长度:切片/数组返回元素个数,字符串返回字节数,通道返回待接收元素数
make(t, size)创建并初始化切片、map、通道:切片需指定长度(可选容量),map 指定初始空间,通道指定缓冲区容量
max(x, y)返回多个同类型参数中的最大值;参数需为可比较类型(如数值、字符串)
min(x, y)返回多个同类型参数中的最小值;参数需为可比较类型(如数值、字符串)
new()分配内存:创建指定类型的指针,指向零值初始化的该类型变量
panic(v)触发运行时恐慌(异常),终止当前 goroutine 执行;可被 recover 捕获
print(args)底层打印函数:输出参数内容,无换行,仅用于调试(不推荐生产环境使用)
println(args)底层打印函数:输出参数内容并换行,仅用于调试(不推荐生产环境使用)
real(c)返回复数 c 的实部,类型为 float64
recover()捕获 panic 抛出的异常,恢复程序执行;仅在 defer 函数中调用有效

使用示例

go
package main

import "fmt"

func main() {
    // ===== append: 向切片末尾追加元素 =====
    slice := []int{1, 2, 3}
    slice = append(slice, 4, 5)          // 追加多个元素
    slice = append(slice, []int{6, 7}...) // 追加另一个切片
    fmt.Printf("append示例: %v\n", slice)

    // 特殊情况:追加字符串到字节切片
    bytes := []byte("hello ")
    bytes = append(bytes, "world"...)
    fmt.Printf("追加字符串: %s\n", string(bytes))

    // ===== cap: 返回容器的容量 =====
    arr := [5]int{1, 2, 3}
    slice2 := arr[0:3]
    fmt.Printf("\ncap示例:\n")
    fmt.Printf("数组容量: %d\n", cap(arr))
    fmt.Printf("切片容量: %d\n", cap(slice2))

    // 创建带初始容量的切片
    slice3 := make([]int, 3, 10) // 长度3,容量10
    fmt.Printf("自定义容量切片 - 长度: %d, 容量: %d\n", len(slice3), cap(slice3))

    // ===== clear: 清空容器内容 =====
    // 切片示例
    numbers := []int{1, 2, 3, 4, 5}
    clear(numbers) // 将所有元素置为零值
    fmt.Printf("\nclear切片示例: %v (长度: %d, 容量: %d)\n", numbers, len(numbers), cap(numbers))

    // map示例
    scores := map[string]int{"Alice": 95, "Bob": 88, "Charlie": 92}
    clear(scores) // 删除所有键值对
    fmt.Printf("clear map示例: %v (长度: %d)\n", scores, len(scores))

    // ===== close: 关闭通道 =====
    fmt.Println("\nclose通道示例:")
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // 关闭通道

    // 从已关闭通道接收数据
    for val := range ch {
        fmt.Printf("接收值: %d\n", val)
    }

    // 尝试从已关闭通道接收
    val, ok := <-ch
    fmt.Printf("通道已关闭,再次接收: 值=%d, 成功=%t\n", val, ok)

    // ===== complex: 创建复数 =====
    c1 := complex(3, 4)     // 创建complex128
    c2 := complex(1.5, 2.5) // 另一个复数
    fmt.Printf("\ncomplex示例:\n")
    fmt.Printf("复数 c1 = %v\n", c1)
    fmt.Printf("复数 c2 = %v\n", c2)
    fmt.Printf("c1 + c2 = %v\n", c1+c2)

    // ===== copy: 复制切片内容 =====
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 3) // 目标切片长度为3
    n := copy(dst, src)   // 复制3个元素
    fmt.Printf("\ncopy示例:\n")
    fmt.Printf("源切片: %v\n", src)
    fmt.Printf("目标切片: %v\n", dst)
    fmt.Printf("复制元素数量: %d\n", n)

    // 重叠复制
    data := []int{1, 2, 3, 4, 5}
    copy(data[2:], data[1:]) // 重叠复制
    fmt.Printf("重叠复制结果: %v\n", data)

    // ===== delete: 从map中删除键值对 =====
    inventory := map[string]int{
        "apple":  10,
        "banana": 20,
        "orange": 15,
    }
    fmt.Printf("\ndelete示例 (删除前): %v\n", inventory)
    delete(inventory, "banana") // 删除指定键
    fmt.Printf("删除后: %v\n", inventory)

    // 尝试删除不存在的键
    delete(inventory, "grape") // 无副作用
    fmt.Printf("删除不存在的键后: %v\n", inventory)

    // ===== imag: 获取复数的虚部 =====
    c := complex(5, 12)
    imaginaryPart := imag(c)
    fmt.Printf("\nimag示例:\n")
    fmt.Printf("复数: %v\n", c)
    fmt.Printf("虚部: %v\n", imaginaryPart)
    fmt.Printf("类型: %T\n", imaginaryPart)

    // ===== len: 返回容器的长度 =====
    str := "Hello, 世界" // 包含中文字符
    fmt.Printf("\nlen示例:\n")
    fmt.Printf("字符串 \"%s\" 的字节数: %d\n", str, len(str)) // 注意:返回字节数而非字符数

    arr2 := [4]int{1, 2, 3, 4}
    fmt.Printf("数组长度: %d\n", len(arr2))

    slice4 := []string{"a", "b", "c"}
    fmt.Printf("切片长度: %d\n", len(slice4))

    m := map[string]int{"x": 1, "y": 2, "z": 3}
    fmt.Printf("map长度: %d\n", len(m))

    ch2 := make(chan int, 5)
    ch2 <- 1
    ch2 <- 2
    fmt.Printf("通道待接收元素数: %d\n", len(ch2))

    // ===== make: 创建并初始化容器 =====
    // 创建切片
    s1 := make([]int, 3, 5) // 长度3,容量5
    fmt.Printf("\nmake切片示例: %v (长度: %d, 容量: %d)\n", s1, len(s1), cap(s1))

    // 创建map
    m1 := make(map[string]int, 10) // 初始容量10
    m1["key"] = 42
    fmt.Printf("make map示例: %v\n", m1)

    // 创建通道
    ch3 := make(chan string, 2) // 缓冲区大小为2
    ch3 <- "hello"
    ch3 <- "world"
    fmt.Printf("make通道示例: 可发送2条消息而不阻塞\n")
    fmt.Printf("接收到: %s, %s\n", <-ch3, <-ch3)

    // ===== max/min: 返回最大/最小值 =====
    fmt.Printf("\nmax/min示例:\n")
    fmt.Printf("max(10, 20, 15) = %d\n", max(10, 20, 15))
    fmt.Printf("min(10.5, 20.3, 5.7) = %.1f\n", min(10.5, 20.3, 5.7))
    fmt.Printf("max(\"apple\", \"banana\", \"cherry\") = %s\n", max("apple", "banana", "cherry"))
    fmt.Printf("min(\"apple\", \"banana\", \"cherry\") = %s\n", min("apple", "banana", "cherry"))

    // ===== new: 分配内存 =====
    p := new(int)    // 分配一个int的内存,返回*int
    *p = 42
    fmt.Printf("\nnew示例:\n")
    fmt.Printf("指针: %p, 值: %d\n", p, *p)

    type Person struct {
        Name string
        Age  int
    }
    p2 := new(Person) // 分配结构体内存
    p2.Name = "Alice"
    p2.Age = 30
    fmt.Printf("结构体指针: %+v\n", p2)

    // ===== panic/recover: 异常处理 =====
    fmt.Println("\npanic/recover示例:")
    fmt.Println("开始执行函数")

    // 正常使用 recover 需要在 defer 中
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("捕获到panic: %v\n", r)
            fmt.Println("程序从panic中恢复,继续执行")
        }
    }()

    fmt.Println("即将触发panic")
    panic("这是一个测试panic")
    fmt.Println("这行代码不会执行") // 不会执行

    // ===== print/println: 底层打印函数 =====
    // 注意:这些函数主要用于引导和调试,不推荐在生产代码中使用
    fmt.Println("\nprint/println示例 (输出到stderr,格式不保证):")
    print("这是print输出,")
    println("这是println输出 (会自动换行)")
    println("可以输出多个值:", 42, true, "文本")

    // ===== real: 获取复数的实部 =====
    c3 := complex(7, 24)
    realPart := real(c3)
    fmt.Printf("\nreal示例:\n")
    fmt.Printf("复数: %v\n", c3)
    fmt.Printf("实部: %v\n", realPart)
    fmt.Printf("类型: %T\n", realPart)

    // 复数运算示例
    magnitude := math.Sqrt(real(c3)*real(c3) + imag(c3)*imag(c3))
    fmt.Printf("复数的模: %.1f\n", magnitude)
}

Released under the MIT License.