go_standard_library_reference

ada.wang

Go 标准库完全参考手册

本文档基于 Go 1.26.5 标准库 整理编写。 涵盖所有公开标准库包的核心用法,每个功能配有代码示例和中文注释。 示例来源:Go 官方文档 pkg.go.dev


fmt — 格式化输入输出

打印函数

常用占位符

占位符 含义 示例输出
%v 值的默认格式 {7 -2.35}
%+v 带字段名的结构体 {a:7 b:-2.35}
%#v Go 语法表示 main.T{a:7, b:-2.35}
%T 值的类型 main.T
%d 十进制整数 42
%s 字符串 "hello"
%q 带引号字符串 "hello"
%f 浮点数 3.141593
%.2f 两位小数浮点数 3.14
%t 布尔值 true
%x 十六进制 ff
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    // Printf — 格式化输出
    fmt.Printf("Hello, %s!\n", "World")

    // %d — 整数占位符
    fmt.Printf("年龄: %d 岁\n", 25)

    // %v — 任意值的默认格式,适合快速打印
    fmt.Printf("值: %v\n", Person{"Alice", 30})

    // %+v — 结构体带字段名,调试时非常有用
    fmt.Printf("详细: %+v\n", Person{"Bob", 25})

    // %#v — 完整的 Go 语法表示,用于调试复杂类型
    fmt.Printf("Go语法: %#v\n", Person{"Charlie", 35})

    // %T — 打印类型,调试接口值时很常用
    var v interface{} = "hello"
    fmt.Printf("类型: %T\n", v)

    // %.2f — 控制浮点数精度
    fmt.Printf("圆周率: %.2f\n", 3.14159265)

    // Sprintf — 返回格式化字符串而非打印
    msg := fmt.Sprintf("结果: %d 条记录", 42)
    fmt.Println(msg)

    // Fprintf — 写入到 writer(如文件、HTTP 响应)
    // 下面的例子写入到标准错误
    fmt.Fprintf(stderr, "错误: 文件未找到\n")
}

// 模拟 stderr,实际使用 os.Stderr
var stderr = struct{ Write([]byte) (int, error) }{
    Write: func(p []byte) (int, error) {
        return len(p), nil
    },
}

官方文档:https://pkg.go.dev/fmt@go1.26.5


strings — 字符串操作

常用函数

package main

import (
    "fmt"
    "strings"
)

func main() {
    // Contains — 是否包含子串,O(n) 时间
    fmt.Println(strings.Contains("hello world", "world")) // true

    // HasPrefix / HasSuffix — 前后缀判断
    fmt.Println(strings.HasPrefix("main.go", "main")) // true
    fmt.Println(strings.HasSuffix("photo.jpg", ".jpg")) // true

    // Index — 查找子串位置(未找到返回 -1)
    fmt.Println(strings.Index("hello world", "o"))  // 4
    fmt.Println(strings.Index("hello world", "x"))  // -1

    // LastIndex — 从后往前查找
    fmt.Println(strings.LastIndex("hello world", "o")) // 7

    // Replace — 替换(n<0 替换全部,n>=0 替换前 n 个)
    fmt.Println(strings.Replace("oink oink", "oink", "moo", 1))  // moo oink
    fmt.Println(strings.ReplaceAll("oink oink", "oink", "moo"))  // moo moo

    // ToUpper / ToLower — 大小写转换
    fmt.Println(strings.ToUpper("hello")) // HELLO
    fmt.Println(strings.ToLower("WORLD")) // world

    // Trim / TrimSpace — 去除两端字符
    fmt.Println(strings.TrimSpace("  hello  "))     // hello
    fmt.Println(strings.Trim("!!!hello!!!", "!"))   // hello
    fmt.Println(strings.TrimPrefix("prefix/data", "prefix/")) // data

    // Split / SplitN — 分割字符串
    // SplitN 限制分割次数,防止意外分割过多
    parts := strings.Split("a,b,c", ",")
    fmt.Printf("%q\n", parts) // ["a" "b" "c"]

    // Join — 用分隔符合并字符串切片
    fmt.Println(strings.Join([]string{"usr", "local", "bin"}, "/")) // usr/local/bin

    // Fields — 按空白分割(比 Split 更智能)
    fmt.Printf("%q\n", strings.Fields("  hello   world  ")) // ["hello" "world"]

    // Repeat — 重复字符串
    fmt.Println(strings.Repeat("na", 3) + " Batman") // nanana Batman

    // Builder — 高效构建字符串
    var sb strings.Builder
    sb.WriteString("Hello")
    sb.WriteString(" ")
    sb.WriteString("World")
    sb.WriteByte('!')
    fmt.Println(sb.String()) // Hello World!

    // Count — 统计子串出现次数
    fmt.Println(strings.Count("cheese", "e")) // 3

    // Compare — 比较字符串(Go 1.20+ 也可直接用 ==、<、>)
    fmt.Println(strings.Compare("a", "b")) // -1
    fmt.Println(strings.Compare("a", "a")) // 0
}

官方文档:https://pkg.go.dev/strings@go1.26.5


bytes — 字节切片操作

package main

import (
    "bytes"
    "fmt"
)

func main() {
    // Buffer — 高效的字节缓冲区
    var buf bytes.Buffer
    buf.Write([]byte("Hello "))
    buf.WriteString("World")
    buf.WriteByte('!')
    fmt.Println(buf.String()) // Hello World!

    // Buffer 也可以作为 io.Reader 使用
    data := make([]byte, 5)
    n, _ := buf.Read(data)
    fmt.Printf("读取 %d 字节: %s\n", n, data[:n]) // 读取 5 字节: Hello

    // Compare — 比较两个字节切片
    fmt.Println(bytes.Compare([]byte("abc"), []byte("abd"))) // -1

    // Contains — 是否包含子切片
    fmt.Println(bytes.Contains([]byte("hello"), []byte("ell"))) // true

    // Equal — 判断相等(比 bytes.Compare(...)==0 更简洁)
    fmt.Println(bytes.Equal([]byte("go"), []byte("go"))) // true

    // Repeated — 重复连接
    fmt.Printf("%s\n", bytes.Repeat([]byte("ab"), 3)) // ababab

    // Trim — 去掉两端字符
    fmt.Printf("%s\n", bytes.Trim([]byte("!!hello!!"), "!")) // hello

    // Split / Join
    parts := bytes.Split([]byte("a,b,c"), []byte(","))
    for _, p := range parts {
        fmt.Printf("%s ", p) // a b c
    }
    fmt.Println()
    joined := bytes.Join(parts, []byte("-"))
    fmt.Printf("%s\n", joined) // a-b-c

    // NewReader — 从 []byte 创建 io.Reader
    reader := bytes.NewReader([]byte("hello world"))
    readBuf := make([]byte, 5)
    reader.Read(readBuf)
    fmt.Printf("%s\n", readBuf) // hello

    // Go 1.19+: Clone 复制字节切片
    original := []byte("sensitive data")
    cloned := bytes.Clone(original)
    cloned[0] = 'c'
    fmt.Printf("original=%s cloned=%s\n", original, cloned)
}

官方文档:https://pkg.go.dev/bytes@go1.26.5


strconv — 字符串转换

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Atoi / Itoa — 字符串与整数的互转(最常用)
    n, err := strconv.Atoi("42")
    if err != nil {
        fmt.Println("转换失败:", err)
    }
    fmt.Printf("Atoi: %d (类型: %T)\n", n, n)

    s := strconv.Itoa(42)
    fmt.Printf("Itoa: %s (类型: %T)\n", s, s)

    // ParseInt — 可指定进制和位数
    hex, _ := strconv.ParseInt("FF", 16, 64)
    fmt.Println("十六进制 FF =", hex) // 255

    bin, _ := strconv.ParseInt("1010", 2, 64)
    fmt.Println("二进制 1010 =", bin) // 10

    // FormatInt / FormatFloat — 格式化数字
    // FormatInt 可以格式化为各种进制
    str := strconv.FormatInt(255, 16)
    fmt.Println("255 的十六进制:", str) // "ff"

    // ParseFloat / FormatFloat
    f, _ := strconv.ParseFloat("3.14159", 64)
    fmt.Println("浮点数:", f)

    // 格式化浮点数(保留 2 位小数)
    formatted := strconv.FormatFloat(3.14159, 'f', 2, 64)
    fmt.Println("格式化:", formatted) // "3.14"

    // ParseBool / FormatBool
    b, _ := strconv.ParseBool("true")
    fmt.Println("布尔值:", b)
    fmt.Println("格式化布尔:", strconv.FormatBool(false)) // "false"

    // AppendInt — 追加到字节切片(比 FormatInt + 拼接更高效)
    buf := make([]byte, 0, 32)
    buf = strconv.AppendInt(buf, 12345, 10)
    buf = append(buf, ' ')
    buf = strconv.AppendFloat(buf, 3.14, 'f', 2, 64)
    fmt.Printf("追加结果: %s\n", buf)

    // ParseUint — 无符号整数
    u, _ := strconv.ParseUint("999", 10, 64)
    fmt.Println("无符号整数:", u)
}

官方文档:https://pkg.go.dev/strconv@go1.26.5


errors — 错误处理

package main

import (
    "errors"
    "fmt"
    "io/fs"
    "os"
)

var ErrNotFound = errors.New("not found")
var ErrPermission = errors.New("permission denied")

func main() {
    // errors.New — 创建简单错误
    err := errors.New("发生了错误")
    fmt.Println(err)

    // fmt.Errorf + %w — 包装错误(Go 1.13+)
    err = fmt.Errorf("读取配置: %w", ErrNotFound)
    fmt.Println(err) // "读取配置: not found"

    // errors.Is — 检查错误链中是否包含指定错误
    if errors.Is(err, ErrNotFound) {
        fmt.Println("✅ 匹配 ErrNotFound")
    }

    // errors.As — 将错误断言为特定类型
    _, err = os.Open("/nonexistent")
    var pathErr *fs.PathError
    if errors.As(err, &pathErr) {
        fmt.Printf("操作: %s, 路径: %s\n", pathErr.Op, pathErr.Path)
    }

    // errors.Join — 合并多个错误(Go 1.20+)
    err1 := errors.New("错误1")
    err2 := errors.New("错误2")
    combined := errors.Join(err1, err2)
    fmt.Println("合并:", combined)
    fmt.Println("包含 err1?", errors.Is(combined, err1)) // true

    // errors.Unwrap — 解包一层错误
    wrapped := fmt.Errorf("外层: %w", ErrNotFound)
    unwrapped := errors.Unwrap(wrapped)
    fmt.Println("解包:", unwrapped) // "not found"
}

官方文档:https://pkg.go.dev/errors@go1.26.5


cmp — 可比较类型的比较

package main

import (
    "cmp"
    "fmt"
)

func main() {
    // Compare — 泛型比较 (-1, 0, 1)
    fmt.Println(cmp.Compare(3, 5))   // -1
    fmt.Println(cmp.Compare(5, 5))   // 0
    fmt.Println(cmp.Compare(7, 2))   // 1
    fmt.Println(cmp.Compare("a", "b")) // -1

    // Less — 是否小于(返回 bool)
    fmt.Println(cmp.Less(3, 5))  // true
    fmt.Println(cmp.Less(5, 3))  // false

    // Or — 返回第一个非零值(Go 1.22+)
    zero := 0
    val := cmp.Or(zero, 42, 100)
    fmt.Println("Or 结果:", val) // 42(跳过 0,取第一个非零值)

    // Or 的典型用法:提供默认值
    userInput := ""
    display := cmp.Or(userInput, "默认用户")
    fmt.Println("显示:", display) // "默认用户"
}

官方文档:https://pkg.go.dev/cmp@go1.26.5


time — 时间与时区

package main

import (
    "fmt"
    "time"
)

func main() {
    // Now — 获取当前时间(使用单调时钟)
    now := time.Now()
    fmt.Println("当前时间:", now)

    // Date — 创建特定时间
    t := time.Date(2024, time.January, 15, 10, 30, 0, 0, time.UTC)
    fmt.Println("指定时间:", t)

    // Parse / Format — 时间解析和格式化
    // ⚠️ 为什么 layout 是 "2006-01-02 15:04:05":
    //   这是 Go 的诞生时间,不是随便写的格式字符串
    t2, _ := time.Parse("2006-01-02 15:04:05", "2024-03-20 14:30:00")
    fmt.Println("解析结果:", t2)

    // Format — 格式化为字符串
    fmt.Println("格式化:", t2.Format("2006-01-02 (Mon) 15:04"))
    fmt.Println("RFC3339:", t2.Format(time.RFC3339))

    // 常用时间常量
    fmt.Println("RFC3339 格式:", time.RFC3339)

    // Duration — 时间间隔
    later := t.Add(2 * time.Hour)
    fmt.Println("两小时后:", later)

    diff := later.Sub(t)
    fmt.Println("差值:", diff) // 2h0m0s

    // Since / Until — 简洁的时间差计算
    started := time.Now()
    // ... 模拟耗时操作
    time.Sleep(10 * time.Millisecond)
    fmt.Printf("耗时: %v\n", time.Since(started))

    // Timer / Ticker — 定时器和周期执行
    // Timer — 一次性定时器
    timer := time.NewTimer(50 * time.Millisecond)
    <-timer.C
    fmt.Println("定时器触发")

    // Ticker — 周期性定时器
    ticker := time.NewTicker(30 * time.Millisecond)
    count := 0
    for range ticker.C {
        count++
        fmt.Printf("tick %d\n", count)
        if count >= 3 {
            ticker.Stop()
            break
        }
    }

    // After — 简化的延迟(返回 channel)
    <-time.After(10 * time.Millisecond)
    fmt.Println("After 延迟完成")

    // Sleep — 休眠
    time.Sleep(5 * time.Millisecond)

    // 时区处理
    loc, _ := time.LoadLocation("America/New_York")
    nyTime := now.In(loc)
    fmt.Printf("纽约时间: %s\n", nyTime.Format("15:04"))

    // Unix 时间戳
    unix := time.Now().Unix()
    fmt.Printf("Unix 时间戳: %d\n", unix)
    fromUnix := time.Unix(unix, 0)
    fmt.Printf("从时间戳恢复: %s\n", fromUnix)
}

官方文档:https://pkg.go.dev/time@go1.26.5


io / io/fs — 输入输出与文件系统

package main

import (
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    // Reader / Writer — 最核心的接口
    // io.Reader:任何可以读取数据的对象
    // io.Writer:任何可以写入数据的对象

    // 1. 从字符串创建 Reader
    reader := strings.NewReader("Hello, Go IO!")

    // 2. 复制到标准输出(Writer)
    // io.Copy — 标准的数据传输方式
    n, err := io.Copy(os.Stdout, reader)
    if err != nil {
        fmt.Println("复制出错:", err)
    }
    fmt.Printf("\n复制了 %d 字节\n", n)

    // ReadAll — 读取所有数据(Go 1.16+,替代 ioutil.ReadAll)
    data, err := io.ReadAll(strings.NewReader("hello"))
    fmt.Printf("ReadAll: %s\n", data)

    // ReadFull — 精确读取 len(buf) 字节
    buf := make([]byte, 5)
    _, err = io.ReadFull(strings.NewReader("hello world"), buf)
    fmt.Printf("ReadFull: %s\n", buf) // "hello"

    // NopCloser — 把 Reader 变成 ReadCloser
    rc := io.NopCloser(strings.NewReader("data"))
    defer rc.Close()

    // MultiReader — 合并多个 Reader 顺序读取
    r1 := strings.NewReader("Hello ")
    r2 := strings.NewReader("World")
    mr := io.MultiReader(r1, r2)
    all, _ := io.ReadAll(mr)
    fmt.Printf("MultiReader: %s\n", all)

    // MultiWriter — 同时写入多个 Writer
    var buf1, buf2 strings.Builder
    mw := io.MultiWriter(&buf1, &buf2)
    mw.Write([]byte("同步写入"))
    fmt.Printf("buf1: %s, buf2: %s\n", buf1.String(), buf2.String())

    // io.Discard — 丢弃数据的 Writer
    io.CopyN(io.Discard, strings.NewReader("丢弃"), 3)

    // Pipe — 内存管道
    pr, pw := io.Pipe()
    go func() {
        pw.Write([]byte("管道数据"))
        pw.Close()
    }()
    pipeData, _ := io.ReadAll(pr)
    fmt.Printf("Pipe: %s\n", pipeData)
}

官方文档:https://pkg.go.dev/io@go1.26.5


net — 网络基础

package main

import (
    "fmt"
    "net"
)

func main() {
    // LookupHost — DNS 解析(查 A/AAAA 记录)
    ips, err := net.LookupHost("google.com")
    if err != nil {
        fmt.Println("DNS 查询失败:", err)
    } else {
        fmt.Println("google.com IP:", ips[:2], "...")
    }

    // LookupAddr — 反向 DNS 查询(IP → 域名)
    names, err := net.LookupAddr("8.8.8.8")
    if err == nil && len(names) > 0 {
        fmt.Println("8.8.8.8 域名:", names[0]) // dns.google.
    }

    // ParseIP — 解析 IP 地址字符串
    ip := net.ParseIP("192.168.1.1")
    fmt.Printf("IP: %v (IsLoopback: %v)\n", ip, ip.IsLoopback())

    ipv6 := net.ParseIP("::1")
    fmt.Printf("IPv6 回环: %v\n", ipv6)

    // CIDRMask — 子网掩码
    _, cidr, _ := net.ParseCIDR("192.168.1.0/24")
    fmt.Printf"CIDR 网络: %v, 掩码: %v\n", cidr.IP, cidr.Mask)

    // 判断 IP 是否在网段内
    testIP := net.ParseIP("192.168.1.100")
    fmt.Println("是否在 192.168.1.0/24:", cidr.Contains(testIP)) // true

    // Interfaces — 获取网络接口列表
    ifaces, _ := net.Interfaces()
    for _, iface := range ifaces {
        fmt.Printf("接口: %s, MAC: %s, MTU: %d\n", iface.Name, iface.HardwareAddr, iface.MTU)
    }

    // Dial — 建立 TCP 连接
    conn, err := net.Dial("tcp", "google.com:80")
    if err == nil {
        conn.Write([]byte("GET / HTTP/1.0\r\nHost: google.com\r\n\r\n"))
        buf := make([]byte, 256)
        n, _ := conn.Read(buf)
        fmt.Printf("HTTP 响应前 %d 字节: %s...\n", n, buf[:50])
        conn.Close()
    }
}

官方文档:https://pkg.go.dev/net@go1.26.5


net/http — HTTP 客户端与服务端

HTTP 客户端

package main

import (
    "fmt"
    "io"
    "net/http"
    "strings"
    "time"
)

func main() {
    // Get — 最简单的 GET 请求
    resp, err := http.Get("https://api.github.com")
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()

    // 读取响应体
    body, _ := io.ReadAll(resp.Body)
    fmt.Printf("状态码: %d, 响应长度: %d\n", resp.StatusCode, len(body))

    // 带超时的 Client
    client := &http.Client{
        Timeout: 5 * time.Second, // 5 秒超时
    }
    resp2, _ := client.Get("https://httpbin.org/delay/1")
    if resp2 != nil {
        defer resp2.Body.Close()
        fmt.Println("带超时的请求成功")
    }

    // NewRequest — 自定义请求(设置 Header、Body 等)
    jsonBody := `{"name":"test"}`
    req, _ := http.NewRequest("POST", "https://httpbin.org/post",
        strings.NewReader(jsonBody))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", "Bearer token123")

    resp3, _ := client.Do(req)
    if resp3 != nil {
        defer resp3.Body.Close()
        body3, _ := io.ReadAll(resp3.Body)
        fmt.Printf("自定义请求响应: %s...\n", body3[:50])
    }

    // Transport — 高级配置(连接池、代理等)
    transport := &http.Transport{
        MaxIdleConns:        100,  // 最大空闲连接数
        IdleConnTimeout:     90 * time.Second,
        DisableCompression:  false,
    }
    customClient := &http.Client{
        Transport: transport,
        Timeout:   10 * time.Second,
    }
    _ = customClient

    // Go 1.20+: ResponseController — 控制每个请求的行为
    // 注意:ResponseController 用于服务端,设置 per-request 超时等
}

HTTP 服务端

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)


// UserHandler 处理 /api/users 路由
type UserHandler struct{}

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func (h *UserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        // 查询用户
        users := []User{{ID: 1, Name: "Alice"}, {ID: 2, Name: "Bob"}}
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(users)
    case http.MethodPost:
        // 创建用户
        var user User
        if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        w.WriteHeader(http.StatusCreated)
        json.NewEncoder(w).Encode(map[string]string{"status": "created"})
    }
}

// Go 1.22+: 新的 ServeMux 增强语法
func newRouter() http.Handler {
    mux := http.NewServeMux()

    // 方法 + 路径模式
    mux.HandleFunc("GET /api/users", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("GET users"))
    })

    mux.HandleFunc("POST /api/users", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("POST users"))
    })

    // 路径参数 {id}
    mux.HandleFunc("GET /api/users/{id}", func(w http.ResponseWriter, r *http.Request) {
        id := r.PathValue("id") // 获取路径参数
        w.Write([]byte("GET user: " + id))
    })

    // 通配符匹配
    mux.HandleFunc("GET /files/{path...}", func(w http.ResponseWriter, r *http.Request) {
        path := r.PathValue("path")
        w.Write([]byte("Path: " + path))
    })

    return mux
}

// 中间件模式
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    handler := newRouter()
    wrapped := loggingMiddleware(handler)

    // 初始化 HTTP 服务器(生产环境用 Server 结构体配置)
    srv := &http.Server{
        Addr:    ":8080",
        Handler: wrapped,
    }

    log.Println("启动服务器在 :8080")
    log.Fatal(srv.ListenAndServe())
}

官方文档:https://pkg.go.dev/net/http@go1.26.5


net/url — URL 解析

package main

import (
    "fmt"
    "net/url"
)

func main() {
    // Parse — 解析 URL 字符串
    u, err := url.Parse("https://user:pass@example.com:8080/path/to/page?name=Alice&age=30#section")
    if err != nil {
        fmt.Println("URL 解析失败:", err)
        return
    }

    fmt.Printf("Scheme: %s\n", u.Scheme)     // https
    fmt.Printf("Host: %s\n", u.Host)         // example.com:8080
    fmt.Printf("Path: %s\n", u.Path)         // /path/to/page
    fmt.Printf("Fragment: %s\n", u.Fragment) // section
    fmt.Printf("User: %s\n", u.User.Username()) // user

    // Query — 解析 URL 查询参数
    q := u.Query()
    fmt.Printf("name: %s\n", q.Get("name")) // Alice
    fmt.Printf("age: %s\n", q.Get("age"))   // 30

    // Values — 构建查询参数
    params := url.Values{}
    params.Add("q", "go programming")
    params.Add("page", "1")
    params.Add("tags", "golang")
    params.Add("tags", "stdlib") // 同一个 key 多个值
    fmt.Println("Encode:", params.Encode())

    // URL 编码/解码
    encoded := url.QueryEscape("hello world & more")
    fmt.Println("编码:", encoded)
    decoded, _ := url.QueryUnescape(encoded)
    fmt.Println("解码:", decoded)

    // PathEscape — 路径段的编码
    pathSafe := url.PathEscape("hello world")
    fmt.Println("路径编码:", pathSafe)

    // URL 构建
    built := &url.URL{
        Scheme: "https",
        Host:   "example.com",
        Path:   "/search",
        RawQuery: url.Values{
            "q": {"golang"},
        }.Encode(),
    }
    fmt.Println("构建 URL:", built.String())
}

官方文档:https://pkg.go.dev/net/url@go1.26.5


net/netip — IP 地址类型(Go 1.18+)

package main

import (
    "fmt"
    "net/netip"
)

func main() {
    // ParseAddr — 解析 IP 地址
    ip, err := netip.ParseAddr("192.0.2.1")
    if err != nil {
        fmt.Println("IP 解析失败:", err)
    }
    fmt.Printf("IP: %s\n", ip)         // 192.0.2.1
    fmt.Printf("Is4: %v\n", ip.Is4())  // true
    fmt.Printf("Is6: %v\n", ip.Is6())  // false

    // 作为 map 键(net.IP 不能直接当 map 键)
    ipMap := map[netip.Addr]string{
        netip.MustParseAddr("10.0.0.1"): "router1",
        netip.MustParseAddr("10.0.0.2"): "router2",
    }
    fmt.Println("map:", ipMap)

    // Prefix — IP 网段
    prefix, _ := netip.ParsePrefix("10.0.0.0/8")
    fmt.Printf("Prefix: %s\n", prefix)

    // Contains — 检查 IP 是否在网段内
    fmt.Println("10.1.2.3 在网段内?", prefix.Contains(netip.MustParseAddr("10.1.2.3"))) // true

    // AddrPort — 地址 + 端口
    ap := netip.MustParseAddrPort("192.168.1.1:80")
    fmt.Printf("Addr: %s, Port: %d\n", ap.Addr(), ap.Port())

    // IPv6 支持
    ip6 := netip.MustParseAddr("::1")
    fmt.Printf("IPv6 回环: %s, IsLoopback: %v\n", ip6, ip6.IsLoopback())
}

官方文档:https://pkg.go.dev/net/netip@go1.26.5


sync — 同步原语

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    // Mutex — 互斥锁
    var mu sync.Mutex
    counter := 0
    var wg sync.WaitGroup

    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            mu.Lock()
            counter++
            mu.Unlock()
        }()
    }
    wg.Wait()
    fmt.Println("计数器:", counter) // 100

    // RWMutex — 读写锁
    var rwmu sync.RWMutex
    var data int
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            rwmu.RLock() // 读锁,可多个同时持有
            fmt.Println("读取 data:", data)
            rwmu.RUnlock()
        }()
    }
    wg.Add(1)
    go func() {
        defer wg.Done()
        time.Sleep(10 * time.Millisecond)
        rwmu.Lock() // 写锁,必须独占
        data = 42
        rwmu.Unlock()
    }()
    wg.Wait()

    // WaitGroup — 等待一组 goroutine 完成
    var wg2 sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg2.Add(1)
        go func(id int) {
            defer wg2.Done()
            fmt.Printf("工作 %d 完成\n", id)
        }(i)
    }
    wg2.Wait()
    fmt.Println("所有工作完成")

    // Once — 只执行一次
    var once sync.Once
    initFunc := func() {
        fmt.Println("初始化(只执行一次)")
    }
    for i := 0; i < 5; i++ {
        go once.Do(initFunc)
    }

    // Pool — 对象池
    var pool = sync.Pool{
        New: func() interface{} {
            return make([]byte, 1024)
        },
    }
    buf := pool.Get().([]byte) // 从池中获取
    buf[0] = 1
    pool.Put(buf) // 放回池中

    // Go 1.21+: WaitGroup.Go(简化 goroutine 启动)
    var wg3 sync.WaitGroup
    wg3.Go(func() {
        fmt.Println("自动 Add/Done")
    })
    wg3.Wait()
}

官方文档:https://pkg.go.dev/sync@go1.26.5


sync/atomic — 原子操作

package main

import (
    "fmt"
    "sync/atomic"
)

func main() {
    // atomic.Int64 — 原子整数(Go 1.19+)
    var counter atomic.Int64
    counter.Add(1)
    counter.Add(1)
    fmt.Println("计数器:", counter.Load()) // 2

    counter.Store(100)
    fmt.Println("设置后:", counter.Load())

    // CompareAndSwap — CAS 操作
    swapped := counter.CompareAndSwap(100, 200)
    fmt.Printf("CAS 成功: %v, 值: %d\n", swapped, counter.Load())

    // Swap — 原子交换
    old := counter.Swap(50)
    fmt.Printf("旧值: %d, 新值: %d\n", old, counter.Load())

    // atomic.Bool — 原子布尔值
    var flag atomic.Bool
    flag.Store(true)
    fmt.Println("flag:", flag.Load())

    // atomic.Pointer — 原子指针
    type Config struct{ Addr string }
    var config atomic.Pointer[Config]
    config.Store(&Config{Addr: ":8080"})
    cfg := config.Load()
    fmt.Println("配置:", cfg.Addr)

    // 旧版函数(int32/int64/uint32/uint64/uintptr/unsafe.Pointer)
    var x int64
    atomic.AddInt64(&x, 1)
    fmt.Println("旧版:", atomic.LoadInt64(&x))
}

官方文档:https://pkg.go.dev/sync/atomic@go1.26.5


context — 上下文(超时/取消/传值)

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    // Background — 根 context(从不取消)
    ctx := context.Background()

    // TODO — 当不确定用什么 context 时
    // 用于待迁移的代码
    _ = context.TODO()

    // WithCancel — 可手动取消的 context
    ctx, cancel := context.WithCancel(ctx)
    go func() {
        time.Sleep(20 * time.Millisecond)
        cancel() // 取消 context
    }()
    <-ctx.Done()
    fmt.Println("取消原因:", ctx.Err()) // context canceled

    // WithTimeout — 带超时的 context(最常用)
    ctx2, cancel2 := context.WithTimeout(context.Background(), 50*time.Millisecond)
    defer cancel2()

    select {
    case <-time.After(100 * time.Millisecond):
        fmt.Println("操作完成")
    case <-ctx2.Done():
        fmt.Println("超时:", ctx2.Err()) // context deadline exceeded
    }

    // WithDeadline — 指定绝对时间截止
    deadline := time.Now().Add(50 * time.Millisecond)
    ctx3, cancel3 := context.WithDeadline(context.Background(), deadline)
    defer cancel3()

    // WithValue — 传递请求范围的值
    // ⚠️ 注意:不要用 WithValue 传递函数参数
    ctx4 := context.WithValue(context.Background(), "traceID", "abc-123")
    traceID := ctx4.Value("traceID")
    fmt.Println("TraceID:", traceID)

    // Go 1.20: WithCancelCause — 带取消原因的 context
    ctx5, cancel5 := context.WithCancelCause(context.Background())
    cancel5(fmt.Errorf("数据库连接失败"))
    fmt.Println("Cause:", context.Cause(ctx5))

    // 调用链示例:模拟 API 调用
    type result struct {
        data string
        err  error
    }
    ch := make(chan result, 1)

    // 模拟一个可能慢的外部调用
    go func() {
        time.Sleep(10 * time.Millisecond)
        ch <- result{data: "响应数据", err: nil}
   }()

    // 设置 100ms 超时
    apiCtx, apiCancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
    defer apiCancel()

    select {
    case res := <-ch:
        fmt.Printf("API 响应: %s (err=%v)\n", res.data, res.err)
    case <-apiCtx.Done():
        fmt.Println("API 超时!")
    }
}

官方文档:https://pkg.go.dev/context@go1.26.5


os — 操作系统接口

package main

import (
    "fmt"
    "os"
)

func main() {
    // 文件创建与写入
    // OpenFile / Create / Write — 文件操作
    f, err := os.CreateTemp("", "example-*.txt")
    if err != nil {
        panic(err)
    }
    defer os.Remove(f.Name())

    // WriteString / Write — 写入文件
    _, err = f.WriteString("Hello, Go!")
    if err != nil {
        fmt.Println("写入失败:", err)
    }
    f.Close()

    // ReadFile — 读取整个文件(Go 1.16+)
    data, err := os.ReadFile(f.Name())
    if err != nil {
        fmt.Println("读取失败:", err)
    }
    fmt.Printf("文件内容: %s\n", data)

    // Stat — 获取文件信息
    info, _ := os.Stat(f.Name())
    fmt.Printf("文件名: %s, 大小: %d, 是否为目录: %v\n",
        info.Name(), info.Size(), info.IsDir())

    // 环境变量
    os.Setenv("APP_MODE", "production")
    mode := os.Getenv("APP_MODE")
    fmt.Println("APP_MODE:", mode)

    home := os.Getenv("HOME")
    fmt.Println("HOME:", home)

    // 查找 PATH 中的可执行文件
    path, _ := os.Executable()
    fmt.Println("当前可执行文件:", path)

    // 工作目录
    dir, _ := os.Getwd()
    fmt.Println("当前目录:", dir)

    // MkdirTemp — 创建临时目录
    tmpDir, _ := os.MkdirTemp("", "example-*")
    defer os.RemoveAll(tmpDir)
    fmt.Println("临时目录:", tmpDir)

    // MkdirAll — 创建多层目录
    err = os.MkdirAll(tmpDir+"/a/b/c", 0755)
    if err == nil {
        fmt.Println("创建多层目录成功")
    }

    // IsNotExist — 判断文件不存在
    _, err = os.Stat("/nonexistent")
    if os.IsNotExist(err) {
        fmt.Println("文件不存在")
    }

    // Hostname — 主机名
    host, _ := os.Hostname()
    fmt.Println("主机名:", host)

    // Exit — 退出程序
    // os.Exit(0) // 取消注释以退出

    // Args — 命令行参数
    fmt.Println("命令行参数:", os.Args)
}

官方文档:https://pkg.go.dev/os@go1.26.5


path/filepath — 文件路径操作

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    // Join — 拼接路径元素(最常用)
    path := filepath.Join("usr", "local", "bin", "go")
    fmt.Println("路径:", path) // usr/local/bin/go

    // Dir / Base — 目录和文件名
    fullPath := "/home/user/docs/file.txt"
    dir := filepath.Dir(fullPath)
    base := filepath.Base(fullPath)
    fmt.Printf("目录: %s, 文件名: %s\n", dir, base)

    // Ext — 文件扩展名
    ext := filepath.Ext("photo.jpg")
    fmt.Println("扩展名:", ext) // .jpg

    // Split — 分为目录和文件名
    d, f := filepath.Split(fullPath)
    fmt.Printf("Split: %q + %q\n", d, f)

    // Glob — 通配符匹配文件
    matches, _ := filepath.Glob("/usr/local/go/bin/*")
    for _, m := range matches[:3] {
        fmt.Println("匹配:", m)
    }

    // Walk — 遍历目录树
    err := filepath.WalkDir(".", func(path string, d os.DirEntry, err error) error {
        if err != nil {
            return err
        }
        if d.IsDir() {
            fmt.Printf("目录: %s\n", path)
        }
        return nil
    })
    if err != nil {
        fmt.Println("遍历错误:", err)
    }

    // Abs — 获取绝对路径
    abs, _ := filepath.Abs(".")
    fmt.Println("绝对路径:", abs)

    // Rel — 计算相对路径
    base2 := "/a/b"
    target := "/a/b/c/d/e"
    rel, _ := filepath.Rel(base2, target)
    fmt.Println("相对路径:", rel) // c/d/e

    // Match — 文件名匹配
    matched, _ := filepath.Match("*.go", "main.go")
    fmt.Println("匹配 *.go:", matched) // true

    // Clean — 清理路径(去除 . 和 ..)
    dirty := "/a/b/../c/./d"
    clean := filepath.Clean(dirty)
    fmt.Println("清理后:", clean) // /a/c/d
}

官方文档:https://pkg.go.dev/path/filepath@go1.26.5


flag — 命令行参数解析

package main

import (
    "flag"
    "fmt"
    "time"
)

func main() {
    // 定义命令行参数
    // 返回指针
    name := flag.String("name", "默认用户", "用户名(必填)")
    age := flag.Int("age", 18, "年龄")
    verbose := flag.Bool("v", false, "详细模式")
    delay := flag.Duration("timeout", 5*time.Second, "超时时间")

    // 绑定到已有变量
    var port int
    flag.IntVar(&port, "port", 8080, "服务端口")

    // 解析命令行参数
    flag.Parse()

    // 使用参数
    fmt.Printf("名称: %s\n", *name)
    fmt.Printf("年龄: %d\n", *age)
    fmt.Printf("详细模式: %v\n", *verbose)
    fmt.Printf("超时: %v\n", *delay)
    fmt.Printf("端口: %d\n", port)

    // 非 flag 参数
    fmt.Println("剩余参数:", flag.Args())

    // 自定义使用说明
    flag.Usage = func() {
        fmt.Printf("用法: %s [选项]\n", flag.CommandLine.Name())
        fmt.Println("选项:")
        flag.PrintDefaults()
    }

    // 子命令风格(通过 flagset)
    installCmd := flag.NewFlagSet("install", flag.ExitOnError)
    force := installCmd.Bool("force", false, "强制安装")
    _ = force
}

// 运行示例:
// go run main.go --name=张三 --age=30 -v --timeout=10s --port=9000 extra arg

官方文档:https://pkg.go.dev/flag@go1.26.5


embed — 文件嵌入(Go 1.16+)

package main

import (
    "embed"
    "fmt"
    "net/http"
)

//go:embed hello.txt
var helloText string

//go:embed hello.txt
var helloBytes []byte

//go:embed template/*.html
//go:embed static/*
var assets embed.FS

func main() {
    // 嵌入为字符串
    fmt.Println("嵌入的文本:", helloText)

    // 嵌入为字节切片
    fmt.Println("嵌入的字节:", string(helloBytes))

    // 嵌入为 FS — 支持目录
    data, _ := assets.ReadFile("hello.txt")
    fmt.Println("通过 FS 读取:", string(data))

    // 列出嵌入文件
    entries, _ := assets.ReadDir("template")
    for _, e := range entries {
        fmt.Println("嵌入的文件:", e.Name())
    }

    // HTTP 文件服务器 — 嵌入静态资源
    mux := http.NewServeMux()
    mux.Handle("/", http.FileServer(http.FS(assets)))
    fmt.Println("静态文件服务器已准备")
}

// 需要创建 hello.txt 文件并写入内容以运行

> 官方文档:https://pkg.go.dev/embed@go1.26.5

---

## sort — 排序


```go
package main

import (
    "fmt"
    "sort"
)

func main() {
    // Ints / Float64s / Strings — 基本类型排序
    sort.Ints([]int{5, 2, 6, 3, 1, 4})
    // 更推荐使用 slices.Sort (Go 1.21+)

    // Sort.Slice — 自定义排序(最常用)
    people := []struct{Name string; Age int}{
        {"Alice", 30}, {"Bob", 25}, {"Charlie", 35},
    }
    sort.Slice(people, func(i, j int) bool {
        return people[i].Age < people[j].Age
    })
    fmt.Println("按年龄排序:", people)

    // Search — 二分查找(在已排序切片中)
    nums := []int{1, 2, 3, 4, 5}
    idx := sort.Search(len(nums), func(i int) bool {
        return nums[i] >= 3
    })
    fmt.Println("3 的索引:", idx)

    // Sort + Reverse — 逆序
    sort.Sort(sort.Reverse(sort.IntSlice(nums)))
    fmt.Println("逆序:", nums)

    // Stable — 稳定排序
    sort.SliceStable(people, func(i, j int) bool {
        return people[i].Name < people[j].Name
    })
}

官方文档:https://pkg.go.dev/sort@go1.26.5


slices — 泛型切片操作(Go 1.21+)

package main

import (
    "cmp"
    "fmt"
    "slices"
)

func main() {
    // Sort — 泛型排序
    nums := []int{5, 2, 6, 3, 1, 4}
    slices.Sort(nums)
    fmt.Println("排序后:", nums)

    // SortFunc — 自定义排序
    type Person struct{ Name string; Age int }
    people := []Person{{"Alice", 30}, {"Bob", 25}}
    slices.SortFunc(people, func(a, b Person) int {
        return cmp.Compare(a.Age, b.Age)
    })

    // BinarySearch — 二分查找
    idx, found := slices.BinarySearch(nums, 3)
    fmt.Printf("索引: %d, 找到: %v\n", idx, found)

    // Contains — 是否包含
    fmt.Println(slices.Contains([]string{"a", "b"}, "a")) // true

    // Clone — 浅拷贝
    cloned := slices.Clone(nums)

    // Delete — 删除元素
    s := []int{1, 2, 3, 4, 5}
    s = slices.Delete(s, 1, 3) // 删除索引1-2
    fmt.Println("删除后:", s)

    // Insert — 插入
    s2 := []int{1, 5}
    s2 = slices.Insert(s2, 1, 2, 3, 4)
    fmt.Println("插入后:", s2)

    // Compact — 去除连续重复
    fmt.Println(slices.Compact([]int{1, 1, 2, 2, 3})) // [1 2 3]

    // Reverse — 反转
    slices.Reverse(s2)

    // Max / Min
    fmt.Println("Max:", slices.Max([]int{3, 7, 2, 9}))

    // Chunk — 分块迭代(Go 1.26+)
    for chunk := range slices.Chunk([]int{1, 2, 3, 4, 5}, 2) {
        fmt.Println("块:", chunk)
    }
}

官方文档:https://pkg.go.dev/slices@go1.26.5


maps — 泛型 Map 操作(Go 1.21+)

package main

import (
    "fmt"
    "maps"
)

func main() {
    // Clone — 浅拷贝
    m1 := map[string]int{"a": 1, "b": 2}
    m2 := maps.Clone(m1)

    // Copy — 复制到另一个 map
    dest := map[string]int{}
    maps.Copy(dest, m1)

    // Equal — 比较
    fmt.Println(maps.Equal(m1, m2)) // true

    // DeleteFunc — 条件删除
    m := map[string]int{"a": 1, "b": 2, "c": 3}
    maps.DeleteFunc(m, func(k string, v int) bool {
        return v%2 == 0
    })
    fmt.Println("删除偶数后:", m)

    // Keys / Values — 迭代器(Go 1.23+)
    for k := range maps.Keys(m1) {
        fmt.Println("key:", k)
    }
}

官方文档:https://pkg.go.dev/maps@go1.26.5


container/heap — 堆

package main

import (
    "container/heap"
    "fmt"
)

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
func (h *MinHeap) Push(x any)        { *h = append(*h, x.(int)) }
func (h *MinHeap) Pop() any {
    old := *h; n := len(old); x := old[n-1]
    *h = old[:n-1]; return x
}

func main() {
    h := &MinHeap{3, 1, 4, 1, 5}
    heap.Init(h)
    heap.Push(h, 2)

    for h.Len() > 0 {
        fmt.Printf("%d ", heap.Pop(h))
    } // 1 1 2 3 4 5
}

官方文档:https://pkg.go.dev/container/heap@go1.26.5


container/list — 双向链表

package main

import (
    "container/list"
    "fmt"
)

func main() {
    l := list.New()
    l.PushBack("a")
    l.PushFront("b")
    l.PushBack("c")

    for e := l.Front(); e != nil; e = e.Next() {
        fmt.Println(e.Value)
    }
    fmt.Println("长度:", l.Len())
}

官方文档:https://pkg.go.dev/container/list@go1.26.5


container/ring — 环形链表

package main

import (
    "container/ring"
    "fmt"
)

func main() {
    r := ring.New(3)
    for i := 0; i < r.Len(); i++ {
        r.Value = i
        r = r.Next()
    }
    r.Do(func(p any) { fmt.Println(p) })
}

官方文档:https://pkg.go.dev/container/ring@go1.26.5


encoding/json — JSON 编解码

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type User struct {
    ID    int      `json:"id"`
    Name  string   `json:"name"`
    Email string   `json:"email,omitempty"`
    Tags  []string `json:"tags,omitempty"`
}

func main() {
    // Marshal — 编码为 JSON
    u := User{ID: 1, Name: "Alice", Email: "a@b.com"}
    data, _ := json.Marshal(u)
    fmt.Println("JSON:", string(data))

    // Unmarshal — 解码
    var u2 User
    json.Unmarshal([]byte(`{"id":2,"name":"Bob"}`), &u2)
    fmt.Printf("解码: %+v\n", u2)

    // 解码到 map(动态 JSON)
    var m map[string]any
    json.Unmarshal([]byte(`{"name":"Charlie","age":30}`), &m)
    fmt.Println("Map:", m["name"], m["age"])

    // Decoder — 流式解码(适合大 JSON / HTTP 流)
    dec := json.NewDecoder(strings.NewReader(`{"x":1}{"x":2}`))
    for {
        var v map[string]int
        if err := dec.Decode(&v); err != nil {
            break
        }
        fmt.Println("流式:", v)
    }

    // RawMessage — 延迟解析
    raw := json.RawMessage(`{"key":"value"}`)
    fmt.Println("原始:", string(raw))
}

官方文档:https://pkg.go.dev/encoding/json@go1.26.5


encoding/csv — CSV 读写

package main

import (
    "encoding/csv"
    "fmt"
    "strings"
)

func main() {
    // 写入 CSV
    var buf strings.Builder
    w := csv.NewWriter(&buf)
    w.Write([]string{"name", "age", "city"})
    w.Write([]string{"Alice", "30", "Beijing"})
    w.Write([]string{"Bob", "25", "Shanghai"})
    w.Flush()

    fmt.Println("CSV 输出:\n", buf.String())

    // 读取 CSV
    r := csv.NewReader(strings.NewReader(buf.String()))
    records, _ := r.ReadAll()
    for _, record := range records {
        fmt.Println("记录:", record)
    }
}

官方文档:https://pkg.go.dev/encoding/csv@go1.26.5


encoding/xml — XML 编解码

package main

import (
    "encoding/xml"
    "fmt"
)

type Person struct {
    XMLName xml.Name `xml:"person"`
    Name    string   `xml:"name"`
    Age     int      `xml:"age,attr"` // 属性
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    data, _ := xml.MarshalIndent(p, "", "  ")
    fmt.Println("XML:", string(data))

    var p2 Person
    xml.Unmarshal([]byte(`<person age="25"><name>Bob</name></person>`), &p2)
    fmt.Printf("%+v\n", p2)
}

官方文档:https://pkg.go.dev/encoding/xml@go1.26.5


encoding/base64 — Base64 编解码

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    data := []byte("hello world")

    // 标准 Base64(末尾带 = 填充)
    s := base64.StdEncoding.EncodeToString(data)
    fmt.Println("标准:", s)

    decoded, _ := base64.StdEncoding.DecodeString(s)
    fmt.Println("解码:", string(decoded))

    // URL 安全的 Base64(替换 +/= 为 URL 安全字符)
    u := base64.URLEncoding.EncodeToString(data)
    fmt.Println("URL 安全:", u)

    // 无填充(适合 JWT)
    r := base64.RawStdEncoding.EncodeToString(data)
    fmt.Println("无填充:", r)

    // RawURLEncoding(JWT 标准)
    jwt := base64.RawURLEncoding.EncodeToString(data)
    fmt.Println("JWT:", jwt)
}

官方文档:https://pkg.go.dev/encoding/base64@go1.26.5


encoding/hex — 十六进制编解码

package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    data := []byte("hello")
    encoded := hex.EncodeToString(data)
    fmt.Println("十六进制:", encoded) // 68656c6c6f

    decoded, _ := hex.DecodeString(encoded)
    fmt.Println("解码:", string(decoded))

    // Dump — 带格式的调试输出
    dump := hex.Dump([]byte("Hello Go Standard Library!"))
    fmt.Println("Dump:\n", dump)
}

官方文档:https://pkg.go.dev/encoding/hex@go1.26.5


encoding/binary — 二进制数据读写

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

func main() {
    buf := new(bytes.Buffer)

    // Write — 将数据以大端序写入
    data := []any{int32(42), uint64(1<<64 - 1), float32(3.14)}
    for _, v := range data {
        binary.Write(buf, binary.BigEndian, v)
    }

    // 读取
    var x int32
    binary.Read(buf, binary.BigEndian, &x)
    fmt.Println("int32:", x)

    // LittleEndian — 小端序
    var y uint16 = 0x0102
    buf.Reset()
    binary.Write(buf, binary.LittleEndian, y)
    fmt.Printf("小端字节: %x\n", buf.Bytes()) // 0201

    // Varint / Uvarint — 可变长度编码
    varBuf := make([]byte, binary.MaxVarintLen64)
    n := binary.PutUvarint(varBuf, 12345)
    val, _ := binary.Uvarint(varBuf[:n])
    fmt.Println("Uvarint:", val)
}

官方文档:https://pkg.go.dev/encoding/binary@go1.26.5


encoding/pem — PEM 格式编解码

package main

import (
    "encoding/pem"
    "fmt"
)

func main() {
    // 编码
    block := &pem.Block{
        Type:  "PUBLIC KEY",
        Bytes: []byte("这里是公钥数据(二进制)"),
    }
    data := pem.EncodeToMemory(block)
    fmt.Println("PEM:\n", string(data))

    // 解码
    decoded, rest := pem.Decode(data)
    fmt.Printf("类型: %s\n", decoded.Type)
    fmt.Printf("内容: %s\n", decoded.Bytes)
    fmt.Printf("剩余: %d 字节\n", len(rest))

    // 多个 PEM 块
    multiPEM := ""
    b1 := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: []byte("cert1")})
    b2 := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: []byte("cert2")})
    multiPEM = string(b1) + string(b2)

    var block2 *pem.Block
    rest2 := []byte(multiPEM)
    for len(rest2) > 0 {
        block2, rest2 = pem.Decode(rest2)
        if block2 == nil {
            break
        }
        fmt.Printf("PEM 块: type=%s, data=%s\n", block2.Type, block2.Bytes)
    }
}

官方文档:https://pkg.go.dev/encoding/pem@go1.26.5


encoding/gob — Go 二进制编解码

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)

    // 编码
    err := enc.Encode(Person{"Alice", 30})
    if err != nil {
        fmt.Println("编码错误:", err)
    }

    // 解码
    var p Person
    dec := gob.NewDecoder(&buf)
    dec.Decode(&p)
    fmt.Printf("解码: %+v\n", p)

    // 多次编解码
    buf.Reset()
    enc = gob.NewEncoder(&buf)
    people := []Person{{"Bob", 25}, {"Charlie", 35}}
    for _, p := range people {
        enc.Encode(p)
    }
    dec = gob.NewDecoder(&buf)
    for {
        var p Person
        if err := dec.Decode(&p); err != nil {
            break
        }
        fmt.Println("流式解码:", p)
    }
}

官方文档:https://pkg.go.dev/encoding/gob@go1.26.5


compress/gzip — Gzip 压缩

package main

import (
    "bytes"
    "compress/gzip"
    "fmt"
    "io"
)

func main() {
    // 压缩
    var buf bytes.Buffer
    gw := gzip.NewWriter(&buf)
    gw.Write([]byte("这是要被压缩的数据,重复的内容可以让压缩率更高。"))
    gw.Close()
    fmt.Printf("压缩前: %d 字节, 压缩后: %d 字节\n",
        60, buf.Len()) // 压缩后更小

    // 解压
    gr, _ := gzip.NewReader(&buf)
    decompressed, _ := io.ReadAll(gr)
    gr.Close()
    fmt.Println("解压后:", string(decompressed))

    // 指定压缩级别
    var buf2 bytes.Buffer
    gw2, _ := gzip.NewWriterLevel(&buf2, gzip.BestCompression)
    gw2.Write([]byte("最高压缩率"))
    gw2.Close()
    fmt.Printf("最高压缩: %d 字节\n", buf2.Len())
}

官方文档:https://pkg.go.dev/compress/gzip@go1.26.5


archive/tar — Tar 归档

package main

import (
    "archive/tar"
    "bytes"
    "fmt"
    "io"
)

func main() {
    var buf bytes.Buffer
    tw := tar.NewWriter(&buf)

    // 写入文件
    files := []struct{ Name, Body string }{
        {"readme.txt", "归档说明"},
        {"notes.txt", "一些笔记"},
    }
    for _, file := range files {
        hdr := &tar.Header{
            Name: file.Name,
            Size: int64(len(file.Body)),
        }
        tw.WriteHeader(hdr)
        tw.Write([]byte(file.Body))
    }
    tw.Close()

    // 读取 tar
    tr := tar.NewReader(&buf)
    for {
        hdr, err := tr.Next()
        if err == io.EOF {
            break
        }
        data, _ := io.ReadAll(tr)
        fmt.Printf("%s: %s\n", hdr.Name, data)
    }
}

官方文档:https://pkg.go.dev/archive/tar@go1.26.5


archive/zip — Zip 归档

package main

import (
    "archive/zip"
    "bytes"
    "fmt"
    "io"
    "os"
)

func main() {
    // 创建 zip
    var buf bytes.Buffer
    zw := zip.NewWriter(&buf)

    files := []struct{ Name, Body string }{
        {"hello.txt", "Hello World"},
        {"data.csv", "a,b,c\n1,2,3"},
    }
    for _, f := range files {
        w, _ := zw.Create(f.Name)
        w.Write([]byte(f.Body))
    }
    zw.Close()

    // 读取 zip
    zr, _ := zip.NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
    for _, f := range zr.File {
        rc, _ := f.Open()
        data, _ := io.ReadAll(rc)
        rc.Close()
        fmt.Printf("%s (%d 字节): %s\n", f.Name, f.UncompressedSize64, data)
    }
}

官方文档:https://pkg.go.dev/archive/zip@go1.26.5


log — 基本日志

package main

import (
    "log"
    "os"
)

func main() {
    log.Println("这是一条信息")
    log.Printf("用户 %s 登录成功", "Alice")

    logger := log.New(os.Stdout, "[APP] ", log.Ldate|log.Ltime|log.Lshortfile)
    logger.Println("自定义日志")
    logger.Printf("错误代码: %d", 404)

    f, _ := os.Create("app.log")
    defer f.Close()
    fileLogger := log.New(f, "", log.LstdFlags)
    fileLogger.Println("写入文件")
}

官方文档:https://pkg.go.dev/log@go1.26.5


log/slog — 结构化日志(Go 1.21+)

package main

import (
    "log/slog"
    "os"
)

func main() {
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    logger.Info("用户操作", "user", "Alice", "action", "login")
    logger.Warn("磁盘空间不足", "free", "1.2GB")
    logger.Error("数据库连接失败", "host", "db01", "port", 5432)

    textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
    textLogger.Info("文本格式日志")

    opts := &slog.HandlerOptions{Level: slog.LevelWarn}
    l := slog.New(slog.NewJSONHandler(os.Stdout, opts))
    l.Debug("不输出") // 不会输出
    l.Warn("会输出")

    file, _ := os.Create("slog.log")
    defer file.Close()
    handler := slog.NewMultiHandler(
        slog.NewTextHandler(os.Stdout, nil),
        slog.NewJSONHandler(file, nil),
    )
    multiLogger := slog.New(handler)
    multiLogger.Info("多目标输出")
}

官方文档:https://pkg.go.dev/log/slog@go1.26.5


regexp — 正则表达式

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d{3}-\d{4}`)
    fmt.Println(re.MatchString("电话: 123-4567"))      // true
    fmt.Println(re.FindString("123-4567 987-6543"))    // 123-4567
    fmt.Println(re.FindAllString("123-4567 987-6543", -1)) // [123-4567 987-6543]

    emailRe := regexp.MustCompile(`(\w+)@(\w+\.\w+)`)
    m := emailRe.FindStringSubmatch("alice@example.com")
    fmt.Printf("用户名: %s, 域名: %s\n", m[1], m[2])

    result := regexp.MustCompile(`\s+`).ReplaceAllString("a  b   c", " ")
    fmt.Println("替换:", result)
}

官方文档:https://pkg.go.dev/regexp@go1.26.5


text/template / html/template — 模板引擎

package main

import (
    "html/template"
    "os"
)

func main() {
    tmpl := `Hello, {{.Name}}! 邮箱: {{.Email}}`
    t := template.Must(template.New("page").Parse(tmpl))
    t.Execute(os.Stdout, struct {
        Name  string
        Email string
    }{"Alice", "<script>alert('xss')</script>"})
    // Email 中 <script> 会被自动转义为 &lt;script&gt;
}

官方文档: - https://pkg.go.dev/text/template@go1.26.5 - https://pkg.go.dev/html/template@go1.26.5


crypto/sha256 — 哈希

package main

import (
    "crypto/sha256"
    "encoding/hex"
    "fmt"
)

func main() {
    h := sha256.New()
    h.Write([]byte("hello"))
    fmt.Println("SHA-256:", hex.EncodeToString(h.Sum(nil)))

    // 简化写法
    sum := sha256.Sum256([]byte("hello"))
    fmt.Printf("简短: %x\n", sum)
}

官方文档:https://pkg.go.dev/crypto/sha256@go1.26.5


crypto/aes — 对称加密

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "io"
)

func main() {
    key := []byte("AES256Key-32Char1234567890abc") // 32 字节 = AES-256
    plaintext := []byte("秘密消息")

    block, _ := aes.NewCipher(key)
    gcm, _ := cipher.NewGCM(block)

    nonce := make([]byte, gcm.NonceSize())
    io.ReadFull(rand.Reader, nonce)

    ciphertext := gcm.Seal(nil, nonce, plaintext, nil)
    fmt.Println("密文:", hex.EncodeToString(ciphertext))

    decrypted, _ := gcm.Open(nil, nonce, ciphertext, nil)
    fmt.Println("解密:", string(decrypted))
}

官方文档:https://pkg.go.dev/crypto/aes@go1.26.5


crypto/hpke — 混合公钥加密(Go 1.26+)

package main

import (
    "crypto/hpke"
    "crypto/rand"
    "fmt"
)

func main() {
    sk, pk, _ := hpke.GenerateKey(rand.Reader)
    info := []byte("app-info")
    plaintext := []byte("秘密消息")

    ciphertext, _ := hpke.Seal(pk, info, nil, plaintext)
    decrypted, _ := hpke.Open(sk, info, nil, ciphertext)
    fmt.Println("HPKE 解密:", string(decrypted))
}

官方文档:https://pkg.go.dev/crypto/hpke@go1.26.5


crypto/rand — 安全随机数

package main

import (
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "math/big"
)

func main() {
    // 生成随机字节
    token := make([]byte, 32)
    rand.Read(token)
    fmt.Println("随机 Token:", hex.EncodeToString(token))

    // 安全整数 [0, 100)
    n, _ := rand.Int(rand.Reader, big.NewInt(100))
    fmt.Println("随机数:", n)

    // Go 1.24+: rand.Text(22 字符 Base64)
    // text, _ := rand.Text()
    // fmt.Println("安全文本:", text)

    // 生成 UUID v4
    uuid := make([]byte, 16)
    rand.Read(uuid)
    uuid[6] = (uuid[6] & 0x0f) | 0x40 // 版本 4
    uuid[8] = (uuid[8] & 0x3f) | 0x80 // 变体
    fmt.Printf("UUID: %x-%x-%x-%x-%x\n", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:])
}

官方文档:https://pkg.go.dev/crypto/rand@go1.26.5


crypto/rsa — 非对称加密

package main

import (
    "crypto"
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "crypto/x509"
    "encoding/hex"
    "encoding/pem"
    "fmt"
)

func main() {
    // GenerateKey — 生成 RSA 密钥对(2048 位)
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }
    publicKey := &privateKey.PublicKey

    // EncryptOAEP / DecryptOAEP — OAEP 加密/解密
    secret := []byte("机密消息")
    label := []byte("") // 可选标签
    ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, secret, label)
    if err != nil {
        panic(err)
    }
    fmt.Println("加密后:", hex.EncodeToString(ciphertext))

    plaintext, err := rsa.DecryptOAEP(sha256.New(), nil, privateKey, ciphertext, label)
    if err != nil {
        panic(err)
    }
    fmt.Println("解密后:", string(plaintext))

    // SignPSS / VerifyPSS — PSS 签名/验证
    message := []byte("待签名数据")
    hashed := sha256.Sum256(message)
    signature, err := rsa.SignPSS(rand.Reader, privateKey, crypto.SHA256, hashed[:], nil)
    if err != nil {
        panic(err)
    }
    fmt.Println("签名:", hex.EncodeToString(signature))

    err = rsa.VerifyPSS(publicKey, crypto.SHA256, hashed[:], signature, nil)
    if err != nil {
        fmt.Println("验证失败:", err)
    } else {
        fmt.Println("签名验证: 通过")
    }

    // 导出私钥为 PEM 格式
    privDER, _ := x509.MarshalPKCS8PrivateKey(privateKey)
    privPEM := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privDER})
    fmt.Println("私钥 PEM:\n", string(privPEM))

    // 导出公钥为 PEM 格式
    pubDER, _ := x509.MarshalPKIXPublicKey(publicKey)
    pubPEM := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: pubDER})
    fmt.Println("公钥 PEM:\n", string(pubPEM))
}

官方文档:https://pkg.go.dev/crypto/rsa@go1.26.5


crypto/tls — TLS 传输层安全

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "net/http"
    "os"
)

func main() {
    // TLS 客户端 — 使用自定义根证书
    const rootPEM = `-----BEGIN CERTIFICATE-----
MIIBkjCCATigAwIBAgIQWUfCUXmL8bGjAYSJXhAmfDAKBggqhkjOPQQDAjA4MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTELMAkGA1UEBxMCU0YxCzAJ
BgNVBAoTAmNhMB4XDTI0MDcxNjAwMDAwMFoXDTM0MDcxNjAwMDAwMFowODELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExCzAJBgNVBAcTAlNGMQswCQYD
VQQKEwJjYTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBasrePk7R5rMo3IJocV
9Y5djDZr0BmDjnzQlLpCwG1h33JNWFtRYNThHWPpMZlvACLcZXg57hZ6kJXh6RrA
RSWjIDAeMBIGA1UdEQQLMAqCCGxvY2FsaG9zdDAKBggqhkjOPQQDAgNJADBGAiEA
v3GT+T+YXWUZExIXVfkJwjbt0snqg5h+WiVFXqQIsD4CIQCBJh4Cz3JNZQ2Ok3E1
4DfMZrQIJ7bBLWLTrL/Ce4pkpQ==
-----END CERTIFICATE-----`

    roots := x509.NewCertPool()
    if ok := roots.AppendCertsFromPEM([]byte(rootPEM)); !ok {
        panic("无法解析根证书")
    }

    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                RootCAs: roots,
            },
        },
    }

    // 使用自定义配置发起 HTTPS 请求
    resp, err := client.Get("https://localhost:8443")
    if err != nil {
        fmt.Println("请求失败(预期,因未运行服务):", err)
    } else {
        defer resp.Body.Close()
        fmt.Println("状态码:", resp.StatusCode)
    }

    // 加载证书 — 用于 TLS 服务端
    certPEM := []byte(`-----BEGIN CERTIFICATE-----
MIIBkjCCATigAwIBAgIQWUfCUXmL8bGjAYSJXhAmfDAKBggqhkjOPQQDAjA4MQsw
CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTELMAkGA1UEBxMCU0YxCzAJ
BgNVBAoTAmNhMB4XDTI0MDcxNjAwMDAwMFoXDTM0MDcxNjAwMDAwMFowODELMAkG
A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExCzAJBgNVBAcTAlNGMQswCQYD
VQQKEwJjYTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBasrePk7R5rMo3IJocV
9Y5djDZr0BmDjnzQlLpCwG1h33JNWFtRYNThHWPpMZlvACLcZXg57hZ6kJXh6RrA
RSWjIDAeMBIGA1UdEQQLMAqCCGxvY2FsaG9zdDAKBggqhkjOPQQDAgNJADBGAiEA
v3GT+T+YXWUZExIXVfkJwjbt0snqg5h+WiVFXqQIsD4CIQCBJh4Cz3JNZQ2Ok3E1
4DfMZrQIJ7bBLWLTrL/Ce4pkpQ==
-----END CERTIFICATE-----`)
    keyPEM := []byte(`-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaCIA9pB2KDqRx/Fm
K8MBtq7fH4ONHpL5ggxBsZKFCGuhRANCAATqkT03WYBQTMqc9eZy6gsvNFg6Jc/i
1RP3k2kMdyAVcQh8zAK3qF5+HYKKBWx4eq/VVQ6SxG4LfY2UsBUHlX0c
-----END PRIVATE KEY-----`)
    cert, err := tls.X509KeyPair(certPEM, keyPEM)
    if err != nil {
        fmt.Println("加载证书失败:", err)
    } else {
        // 配置 TLS 服务端
        config := &tls.Config{
            Certificates: []tls.Certificate{cert},
            MinVersion:   tls.VersionTLS12,
        }
        fmt.Println("TLS 配置就绪,证书数:", len(config.Certificates))
    }

    // KeyLogWriter — 导出会话密钥(Wireshark 调试用)
    debugConfig := &tls.Config{
        InsecureSkipVerify: true,
        KeyLogWriter:       os.Stdout,
    }
    _ = debugConfig
}

官方文档:https://pkg.go.dev/crypto/tls@go1.26.5


testing — 测试框架

// 文件名: example_test.go
package main

import (
    "testing"
)

// 单元测试
func TestAdd(t *testing.T) {
    got := Add(1, 2)
    want := 3
    if got != want {
        t.Errorf("Add(1, 2) = %d; want %d", got, want)
    }
}

// 子测试
func TestMath(t *testing.T) {
    tests := []struct{ a, b, want int }{
        {1, 2, 3},
        {0, 0, 0},
        {-1, 1, 0},
    }
    for _, tt := range tests {
        t.Run("加法", func(t *testing.T) {
            got := Add(tt.a, tt.b)
            if got != tt.want {
                t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want)
            }
        })
    }
}

// 基准测试
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(1, 2)
    }
}

// 表驱动测试
func TestDivide(t *testing.T) {
    cases := []struct {
        name    string
        a, b    int
        want    int
        wantErr bool
    }{
        {"正常", 10, 2, 5, false},
        {"除零", 1, 0, 0, true},
    }
    for _, c := range cases {
        t.Run(c.name, func(t *testing.T) {
            got, err := Divide(c.a, c.b)
            if (err != nil) != c.wantErr {
                t.Errorf("错误: wantErr=%v, got=%v", c.wantErr, err)
            }
            if got != c.want {
                t.Errorf("结果: want=%d, got=%d", c.want, got)
            }
        })
    }
}

// TestMain — 测试前/后处理
func TestMain(m *testing.M) {
    // 设置
    println("测试前准备")

    // 运行测试
    code := m.Run()

    // 清理
    println("测试后清理")
    os.Exit(code)
}

// 以下是被测试函数

func Add(a, b int) int { return a + b }

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("不能除以零")
    }
    return a / b, nil
}

// go test -v
// go test -bench=.
// go test -fuzz=Fuzz

官方文档:https://pkg.go.dev/testing@go1.26.5


reflect — 反射

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string `json:"name" validate:"required"`
    Age  int    `json:"age" validate:"gte=0"`
}

func main() {
    u := User{"Alice", 30}
    v := reflect.ValueOf(u)
    t := reflect.TypeOf(u)

    // 遍历结构体字段
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i)
        fmt.Printf("字段: %s, 类型: %s, 值: %v, JSON标签: %s\n",
            field.Name, field.Type, value.Interface(), field.Tag.Get("json"))
    }

    // 读取 StructTag
    nameField, _ := t.FieldByName("Name")
    validate := nameField.Tag.Get("validate")
    fmt.Println("验证规则:", validate) // required

    // 通过反射修改值(需要可寻址)
    pv := reflect.ValueOf(&u)
    pv.Elem().FieldByName("Age").SetInt(35)
    fmt.Println("修改后:", u.Age)

    // 调用方法
    // u 的 String() 方法会在下文被调用
    if m, ok := t.MethodByName("String"); ok {
        result := m.Func.Call([]reflect.Value{v})
        fmt.Println("方法调用:", result[0])
    }

    // 类型判断
    var x any = "hello"
    fmt.Println("type:", reflect.TypeOf(x))
    fmt.Println("kind:", reflect.TypeOf(x).Kind())

    // 创建新实例
    newUser := reflect.New(t).Interface()
    fmt.Printf("新实例: %#v\n", newUser)
}

func (u User) String() string {
    return fmt.Sprintf("User(%s, %d)", u.Name, u.Age)
}

官方文档:https://pkg.go.dev/reflect@go1.26.5


runtime — 运行时信息

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // NumCPU — CPU 核心数
    fmt.Println("CPU 核心数:", runtime.NumCPU())

    // GOMAXPROCS — 可同时使用的 CPU 数
    fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))

    // NumGoroutine — 当前 goroutine 数
    fmt.Println("Goroutine 数:", runtime.NumGoroutine())

    // GOOS / GOARCH — 操作系统和架构
    fmt.Println("OS:", runtime.GOOS, "Arch:", runtime.GOARCH)

    // Version — Go 版本
    fmt.Println("Go 版本:", runtime.Version())

    // Caller — 获取调用栈信息(用于日志记录)
    pc, file, line, ok := runtime.Caller(0)
    if ok {
        fmt.Printf("文件: %s, 行: %d\n", file, line)
        fmt.Printf("函数: %s\n", runtime.FuncForPC(pc).Name())
    }

    // GC — 手动触发垃圾回收
    runtime.GC()
    fmt.Println("GC 已触发")

    // Gosched — 让出 CPU(协作式调度)
    runtime.Gosched()

    // Goexit — 退出当前 goroutine
    // runtime.Goexit()

    // NumCgoCall — CGo 调用次数
    fmt.Println("CGo 调用:", runtime.NumCgoCall())
}

官方文档:https://pkg.go.dev/runtime@go1.26.5


runtime/debug — 运行时调试

package main

import (
    "fmt"
    "runtime/debug"
)

func main() {
    // SetGCPercent — 设置 GC 触发频率
    old := debug.SetGCPercent(100) // 默认 100
    fmt.Println("旧 GCPercent:", old)

    // SetMemoryLimit — 软内存限制(Go 1.19+)
    debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MB

    // FreeOSMemory — 强制释放内存给 OS
    debug.FreeOSMemory()

    // PrintStack — 打印堆栈
    debug.PrintStack()

    // Stack — 获取堆栈字符串
    stack := debug.Stack()
    fmt.Printf("堆栈大小: %d 字节\n", len(stack))

    // BuildInfo — 构建信息
    info, ok := debug.ReadBuildInfo()
    if ok {
        fmt.Printf("Go 版本: %s, 路径: %s\n",
            info.GoVersion, info.Path)
        for _, dep := range info.Deps {
            if dep.Replace != nil {
                continue
            }
            fmt.Printf("  依赖: %s@%s\n", dep.Path, dep.Version)
        }
    }
}

官方文档:https://pkg.go.dev/runtime/debug@go1.26.5


math / math/bits — 数学与位运算

package main

import (
    "fmt"
    "math"
    "math/bits"
)

func main() {
    // math 常量
    fmt.Println("Pi:", math.Pi)
    fmt.Println("E:", math.E)
    fmt.Println("Sqrt2:", math.Sqrt2)

    // 取整
    fmt.Println("Ceil:", math.Ceil(3.14)) // 4
    fmt.Println("Floor:", math.Floor(3.14)) // 3
    fmt.Println("Round:", math.Round(3.5)) // 4

    // 三角函数
    fmt.Println("Sin:", math.Sin(math.Pi/2)) // 1

    // 幂和对数
    fmt.Println("Pow:", math.Pow(2, 10))  // 1024
    fmt.Println("Sqrt:", math.Sqrt(16))   // 4

    // Max/Min 浮点数
    fmt.Println("Max:", math.Max(3.14, 2.72))

    // Inf / NaN
    fmt.Println("IsNaN:", math.IsNaN(math.NaN()))

    // bits 包
    fmt.Println("OnesCount:", bits.OnesCount(0b1011)) // 3(3个1)
    fmt.Println("LeadingZeros:", bits.LeadingZeros8(0x0F)) // 4
    fmt.Println("Reverse:", bits.Reverse8(0b10110000)) // 二进制位反转
}

官方文档: - https://pkg.go.dev/math@go1.26.5 - https://pkg.go.dev/math/bits@go1.26.5


math/big — 大数运算

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // 大整数
    a := big.NewInt(1 << 62)
    b := big.NewInt(1 << 62)
    c := new(big.Int).Mul(a, b)
    fmt.Println("大整数乘积:", c)

    // 从字符串解析
    bigNum, _ := new(big.Int).SetString("12345678901234567890", 10)
    fmt.Println("大整数:", bigNum)

    // 大浮点数(高精度)
    x := new(big.Float).SetPrec(200).SetFloat64(1.0)
    pi := new(big.Float).SetPrec(200).Parse("3.14159265358979323846264338327950288419716939937510", 10)
    fmt.Println("高精度 Pi:", pi.Text('f', 50))

    // 大有理数
    r := new(big.Rat).SetFrac64(22, 7)
    fmt.Println("有理数:", r.FloatString(10)) // 3.1428571429
}

官方文档:https://pkg.go.dev/math/big@go1.26.5


math/rand/v2 — 随机数生成(Go 1.22+)

package main

import (
    "fmt"
    "math/rand/v2"
)

func main() {
    // 随机整数 [0, n)
    fmt.Println("IntN:", rand.IntN(100))

    // 随机浮点数
    fmt.Println("Float64:", rand.Float64()) // [0.0, 1.0)

    // 带种子的随机源
    r := rand.New(rand.NewPCG(1, 2))
    fmt.Println("源:", r.IntN(100))

    // 排列
    perm := rand.Perm(5)
    fmt.Println("排列:", perm)

    // 正态分布
    fmt.Println("正态:", rand.NormFloat64())

    // N — 泛型版本
    val := rand.N(100) // 等价于 rand.IntN(100)
    fmt.Println("N:", val)
}

官方文档:https://pkg.go.dev/math/rand/v2@go1.26.5


iter — 迭代器支持(Go 1.23+)

package main

import (
    "fmt"
    "iter"
    "slices"
)

// Backward — 自定义迭代器
func Backward[E any](s []E) iter.Seq2[int, E] {
    return func(yield func(int, E) bool) {
        for i := len(s) - 1; i >= 0; i-- {
            if !yield(i, s[i]) {
                return
            }
        }
    }
}

func main() {
    s := []string{"a", "b", "c"}

    // 使用自定义迭代器
    for i, v := range Backward(s) {
        fmt.Printf("%d: %s\n", i, v)
    }

    // Pull — 将 Seq 转为拉取式
    seq := slices.Values(s)
    next, stop := iter.Pull(seq)
    defer stop()

    for v, ok := next(); ok; v, ok = next() {
        fmt.Println("拉取:", v)
    }
}

官方文档:https://pkg.go.dev/iter@go1.26.5


unique — 值规范化/驻留(Go 1.23+)

package main

import (
    "fmt"
    "unique"
)

func main() {
    h1 := unique.Make("hello")
    h2 := unique.Make("hello")
    h3 := unique.Make("world")

    fmt.Println(h1 == h2) // true(相同值得到相同句柄)
    fmt.Println(h1 == h3) // false

    // 获取原始值
    fmt.Println(h1.Value()) // "hello"
}

官方文档:https://pkg.go.dev/unique@go1.26.5


structs — 结构体布局控制(Go 1.23+)

package main

import (
    "fmt"
    "structs"
)

type MyStruct struct {
    _ structs.HostLayout // 使用 C 内存布局
    X int32
    Y float64
}

func main() {
    s := MyStruct{X: 10, Y: 3.14}
    fmt.Printf("结构体大小: %d 字节\n", unsafe.Sizeof(s))
}

import "unsafe" // 需要导入 unsafe

官方文档:https://pkg.go.dev/structs@go1.26.5


weak — 弱引用(Go 1.24+)

package main

import (
    "fmt"
    "runtime"
    "weak"
)

func main() {
    s := "hello world"
    w := weak.Make(&s)

    // 强引用还在,可以获取
    if p := w.Value(); p != nil {
        fmt.Println("获取到:", *p)
    }

    // 释放强引用,让 GC 回收
    // runtime.GC() // 取消注释以测试
    // if p := w.Value(); p == nil {
    //     fmt.Println("对象已被 GC 回收")
    // }
    _ = runtime.GC
}

官方文档:https://pkg.go.dev/weak@go1.26.5


builtin — 内建类型和函数

package main

import "fmt"

func main() {
    // 内建类型
    var b bool
    var i int
    var s string
    var ch chan int

    // 内建函数
    // make — 创建 slice/map/channel
    sl := make([]int, 5)
    m := make(map[string]int)
    c := make(chan int, 10)

    // new — 分配零值指针
    p := new(int)

    // append — 追加到切片
    sl = append(sl, 1, 2, 3)

    // len / cap
    fmt.Println(len(sl), cap(sl))

    // close — 关闭 channel
    close(c)

    // delete — 删除 map 元素
    delete(m, "key")

    // panic / recover
    // complex / real / imag
    // min / max / clear (Go 1.21+)

    _, _, _ = b, i, s
    _, _ = ch, p
}

官方文档:https://pkg.go.dev/builtin@go1.26.5


unsafe — 不安全操作

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // Sizeof — 获取类型大小
    fmt.Println("int 大小:", unsafe.Sizeof(int(0)))
    fmt.Println("string 大小:", unsafe.Sizeof(""))
    fmt.Println("结构体对齐:", unsafe.Alignof(struct{ a int8; b int64 }{}))

    // Offsetof — 字段偏移
    type S struct {
        a int8
        b int64
    }
    fmt.Println("字段 b 偏移:", unsafe.Offsetof(S{}.b))

    // Pointer — 任意指针转换
    x := int32(0x12345678)
    p := unsafe.Pointer(&x)
    // 将 int32 的每个字节读作 byte
    bytes := (*[4]byte)(p)
    fmt.Printf("字节: %x\n", *bytes)

    // 注意:unsafe 包绕过了 Go 的安全保证
    // 只在你确实知道自己在做什么时使用
}

官方文档:https://pkg.go.dev/unsafe@go1.26.5


hash/maphash — 哈希函数

package main

import (
    "fmt"
    "hash/maphash"
)

func main() {
    var h maphash.Hash
    h.WriteString("hello")
    h.Write([]byte(" world"))
    fmt.Printf("Hash: %x\n", h.Sum64())

    // 种子哈希(防止哈希碰撞攻击)
    seed := maphash.MakeSeed()
    hash := maphash.Hash(seed, "hello")
    fmt.Printf("带种子的 Hash: %x\n", hash)
}

官方文档:https://pkg.go.dev/hash/maphash@go1.26.5


testing/synctest — 并发测试(Go 1.25+)

package main

import (
    "testing"
    "testing/synctest"
    "time"
)

func TestConcurrent(t *testing.T) {
    synctest.Run(func() {
        ch := make(chan int)
        go func() {
            time.Sleep(time.Hour) // 虚拟时间,不会真的等 1 小时
            ch <- 42
        }()
        result := <-ch // 立即得到结果
        if result != 42 {
            t.Errorf("期望 42, 得到 %d", result)
        }
    })
}

官方文档:https://pkg.go.dev/testing/synctest@go1.26.5


unicode — Unicode 码点分类

package main

import (
    "fmt"
    "unicode"
)

func main() {
    // 字符分类
    fmt.Println(unicode.IsLetter('A'))  // true
    fmt.Println(unicode.IsDigit('9'))   // true
    fmt.Println(unicode.IsSpace(' '))   // true
    fmt.Println(unicode.IsUpper('A'))   // true
    fmt.Println(unicode.IsLower('a'))   // true
    fmt.Println(unicode.IsPunct('.'))   // true
    fmt.Println(unicode.Is(unicode.Han, '中')) // true

    // 大小写转换
    fmt.Println(string(unicode.ToUpper('a'))) // A
    fmt.Println(string(unicode.ToLower('A'))) // a
}

官方文档:https://pkg.go.dev/unicode@go1.26.5


html — HTML 转义

package main

import (
    "fmt"
    "html"
)

func main() {
    raw := `<script>alert("xss")</script>`
    escaped := html.EscapeString(raw)
    fmt.Println("转义:", escaped)
    // &lt;script&gt;alert(&#34;xss&#34;)&lt;/script&gt;

    unescaped := html.UnescapeString(escaped)
    fmt.Println("反转义:", unescaped)
}

官方文档:https://pkg.go.dev/html@go1.26.5


debug/buildinfo — 构建信息

package main

import (
    "debug/buildinfo"
    "fmt"
)

func main() {
    info, err := buildinfo.Read("/usr/local/go/bin/go")
    if err != nil {
        fmt.Println("读取失败:", err)
        return
    }
    fmt.Println("Go 版本:", info.GoVersion)
    fmt.Println("路径:", info.Path)
    for _, dep := range info.Deps {
        fmt.Printf("  依赖: %s@%s\n", dep.Path, dep.Version)
    }
}

官方文档:https://pkg.go.dev/debug/buildinfo@go1.26.5


net/http/pprof — HTTP PProf

package main

import (
    "fmt"
    "net/http"
    _ "net/http/pprof" // 导入副作用:注册 pprof handler
)

func main() {
    // 访问 http://localhost:6060/debug/pprof/ 查看
    fmt.Println("pprof 服务在 :6060")
    http.ListenAndServe("localhost:6060", nil)
}

官方文档:https://pkg.go.dev/net/http/pprof@go1.26.5


go/parser — Go 源代码解析

package main

import (
    "fmt"
    "go/parser"
    "go/token"
)

func main() {
    fset := token.NewFileSet()
    f, err := parser.ParseFile(fset, "hello.go", `package main; func main() {}`, parser.AllErrors)
    if err != nil {
        fmt.Println("解析失败:", err)
    }
    fmt.Printf("包名: %s\n", f.Name.Name)
    fmt.Printf("导入: %d 个\n", len(f.Imports))
    fmt.Printf("声明: %d 个\n", len(f.Decls))
}

官方文档:https://pkg.go.dev/go/parser@go1.26.5


database/sql — SQL 数据库

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3" // 导入数据库驱动
)

func main() {
    db, err := sql.Open("sqlite3", ":memory:")
    if err != nil {
        fmt.Println("打开失败:", err)
        return
    }
    defer db.Close()

    // 创建表
    _, err = db.Exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
    if err != nil {
        fmt.Println("建表失败:", err)
    }

    // 插入
    _, err = db.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
    
    // 查询
    var name string
    db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
    fmt.Println("查询结果:", name)
}

官方文档:https://pkg.go.dev/database/sql@go1.26.5


全部标准库包名速查

以下是 Go 1.26.5 全部公开标准库包名(按字母序):

archive/tar, archive/zip
bufio, builtin, bytes
cmp, compress/bzip2, compress/flate, compress/gzip, compress/lzw, compress/zlib
container/heap, container/list, container/ring
context, crypto, crypto/aes, crypto/cipher, crypto/des, crypto/dsa, crypto/ecdh,
  crypto/ecdsa, crypto/ed25519, crypto/elliptic, crypto/hkdf, crypto/hmac,
  crypto/hpke, crypto/md5, crypto/mlkem, crypto/pbkdf2, crypto/rand, crypto/rc4,
  crypto/rsa, crypto/sha1, crypto/sha256, crypto/sha3, crypto/sha512, crypto/subtle,
  crypto/tls, crypto/x509, crypto/x509/pkix
database/sql, database/sql/driver
debug/buildinfo, debug/dwarf, debug/elf, debug/gosym, debug/macho, debug/pe,
  debug/plan9obj
embed, encoding, encoding/ascii85, encoding/asn1, encoding/base32, encoding/base64,
  encoding/binary, encoding/csv, encoding/gob, encoding/hex, encoding/json,
  encoding/json/v2, encoding/pem, encoding/xml
errors, expvar
flag, fmt
go/ast, go/build, go/build/constraint, go/constant, go/doc, go/doc/comment,
  go/format, go/importer, go/parser, go/printer, go/scanner, go/token, go/types,
  go/version
hash, hash/adler32, hash/crc32, hash/crc64, hash/fnv, hash/maphash
html, html/template
image, image/color, image/color/palette, image/draw, image/gif, image/jpeg, image/png
index/suffixarray
io, io/fs, io/ioutil
iter
log, log/slog, log/syslog
maps, math, math/big, math/bits, math/cmplx, math/rand, math/rand/v2
mime, mime/multipart, mime/quotedprintable
net, net/http, net/http/cgi, net/http/cookiejar, net/http/fcgi, net/http/httptest,
  net/http/httptrace, net/http/httputil, net/http/pprof, net/mail, net/netip,
  net/rpc, net/rpc/jsonrpc, net/smtp, net/textproto, net/url
os, os/exec, os/signal, os/user
path, path/filepath
plugin
reflect, regexp, regexp/syntax
runtime, runtime/cgo, runtime/debug, runtime/metrics, runtime/pprof, runtime/race,
  runtime/secret, runtime/trace
simd/archsimd
slices, sort, strconv, strings, structs, sync, sync/atomic, syscall, syscall/js
testing, testing/cryptotest, testing/fstest, testing/iotest, testing/quick,
  testing/slogtest, testing/synctest
text/scanner, text/tabwriter, text/template, text/template/parse
time, time/tzdata
unicode, unicode/utf16, unicode/utf8
unique, unsafe, weak

完整文档请访问:https://pkg.go.dev/std@go1.26.5