本文档基于 Go 1.26.5 标准库 整理编写。 涵盖所有公开标准库包的核心用法,每个功能配有代码示例和中文注释。 示例来源:Go 官方文档 pkg.go.dev
fmt.Print — 默认格式输出fmt.Printf — 格式化输出(占位符)fmt.Println — 输出后换行fmt.Sprint / Sprintf /
Sprintln — 返回字符串而非打印fmt.Fprint / Fprintf /
Fprintln — 写入 io.Writer| 占位符 | 含义 | 示例输出 |
|---|---|---|
%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
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
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
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
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
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
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
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
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
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 超时等
}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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> 会被自动转义为 <script>
}
官方文档: - https://pkg.go.dev/text/template@go1.26.5 - https://pkg.go.dev/html/template@go1.26.5
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
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
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
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
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
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
// 文件名: 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
package main
import (
"fmt"
"html"
)
func main() {
raw := `<script>alert("xss")</script>`
escaped := html.EscapeString(raw)
fmt.Println("转义:", escaped)
// <script>alert("xss")</script>
unescaped := html.UnescapeString(escaped)
fmt.Println("反转义:", unescaped)
}
官方文档:https://pkg.go.dev/html@go1.26.5
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
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
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
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