Go 语言常用标准库详解

Go 语言常用标准库详解

一、基础类型与工具

fmt --- 格式化 I/O

go 复制代码
fmt.Println("hello")
fmt.Printf("name: %s, age: %d\n", "tom", 18)
fmt.Sprintf("%04d", 42)          // 格式化到字符串
fmt.Errorf("failed: %w", err)    // 错误包装

核心三件套:Print/Sprintf/Fprintf,支持 %v(默认)、%+v(结构体带字段名)、%#v(Go 语法表示)。

strings --- 字符串操作

go 复制代码
strings.Contains(s, "sub")
strings.HasPrefix(s, "http")
strings.Split(s, ",")
strings.Join([]string{"a","b"}, "-")
strings.TrimSpace(s)
strings.ReplaceAll(s, old, new)
strings.Builder{}                 // 高性能拼接

strconv --- 类型转换

go 复制代码
strconv.Atoi("123")              // string → int
strconv.Itoa(123)                // int → string
strconv.ParseFloat("3.14", 64)
strconv.FormatBool(true)
strconv.ParseInt("0xff", 16, 64) // 带进制

regexp --- 正则表达式

go 复制代码
re := regexp.MustCompile(`\d+`)
re.FindAllString(s, -1)
re.MatchString(s)
re.ReplaceAllString(s, "NUM")

二、容器与集合

map(内置)& slices(Go 1.21+)

go 复制代码
// map
m := make(map[string]int)
m["key"] = 1
delete(m, "key")

// slices 泛型工具(Go 1.21)
import "slices"
slices.Sort([]int{3,1,2})
slices.Contains(s, target)
slices.Reverse(s)
slices.Compact(s)                // 去重相邻重复

container --- 专用数据结构

go 复制代码
// container/list --- 双向链表
list.New()
l.PushBack(1)
l.Front()

// container/heap --- 优先队列(需实现 heap.Interface)
// container/ring --- 环形链表

三、I/O 与文件操作

os --- 系统调用入口

go 复制代码
os.Open("file.txt")              // 只读打开
os.Create("out.txt")             // 创建/截断
os.ReadFile("data.json")         // 读取全部
os.WriteFile("out.txt", data, 0644)
os.MkdirAll("a/b/c", 0755)
os.Getenv("HOME")
os.Args                          // 命令行参数
os.Exit(1)

io --- I/O 原语

go 复制代码
io.Copy(dst, src)                // 流式拷贝(核心)
io.ReadAll(r)                    // 读取全部
io.MultiReader(r1, r2)           // 合并多个 Reader
io.LimitReader(r, 1024)          // 限制读取量
io.TeeReader(r, w)               // 读取同时写入

bufio --- 缓冲 I/O

go 复制代码
scanner := bufio.NewScanner(file)
for scanner.Scan() {             // 逐行读取
    line := scanner.Text()
}

writer := bufio.NewWriter(file)
writer.WriteString("line\n")
writer.Flush()                   // 别忘了 Flush!

filepath --- 路径操作

go 复制代码
filepath.Join("a", "b", "c.txt")    // 跨平台路径拼接
filepath.Ext("file.txt")            // ".txt"
filepath.Base("/a/b/c.txt")         // "c.txt"
filepath.Dir("/a/b/c.txt")          // "/a/b"
filepath.Glob("*.go")               // 通配符匹配

四、编码与序列化

encoding/json --- JSON

go 复制代码
// 序列化
data, _ := json.Marshal(obj)
data, _ := json.MarshalIndent(obj, "", "  ")  // 美化

// 反序列化
json.Unmarshal(data, &obj)

// 流式处理(大文件友好)
dec := json.NewDecoder(file)
enc := json.NewEncoder(file)

// 结构体标签
type User struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,string"`
}

encoding/xmlencoding/csvencoding/base64

go 复制代码
// CSV
reader := csv.NewReader(file)
records, _ := reader.ReadAll()

// Base64
encoded := base64.StdEncoding.EncodeToString(data)
decoded, _ := base64.StdEncoding.DecodeString(encoded)

五、网络

net/http --- HTTP 客户端/服务端

go 复制代码
// 服务端
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
    json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
})
http.ListenAndServe(":8080", nil)

// 客户端
resp, err := http.Get("https://api.example.com/data")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)

// 带超时和 Context 的客户端
client := &http.Client{Timeout: 10 * time.Second}
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)

net/url --- URL 解析

go 复制代码
u, _ := url.Parse("https://example.com/path?q=1")
u.Query().Get("q")
url.Values{"key": []string{"val"}}.Encode()

net/rpcnet(TCP/UDP)

go 复制代码
listener, _ := net.Listen("tcp", ":9000")
conn, _ := net.Dial("tcp", "localhost:9000")

六、并发

sync --- 同步原语

go 复制代码
var mu sync.Mutex
mu.Lock()
defer mu.Unlock()

var rw sync.RWMutex
rw.RLock()                      // 读锁(多个读者可并发)
rw.RUnlock()

sync.Once{}                     // 只执行一次
sync.WaitGroup{}                // 等待一组 goroutine 完成
sync.Pool{}                     // 对象池,减少 GC 压力

context --- 请求生命周期管理

go 复制代码
// 传播超时、取消信号、请求级值
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()

ctx, cancel := context.WithCancel(parentCtx)

// 传值(不要滥用)
ctx = context.WithValue(ctx, "requestID", "abc123")

channel(内置)--- goroutine 通信

go 复制代码
ch := make(chan int, 10)        // 带缓冲
ch <- 1                         // 发送
v := <-ch                       // 接收
select {                        // 多路复用
case v := <-ch:
case <-time.After(time.Second):
case <-ctx.Done():
}

七、时间

time --- 时间与定时器

go 复制代码
now := time.Now()
t, _ := time.Parse("2006-01-02", "2024-01-01")
t.Format("2006-01-02 15:04:05") // Go 的日期模板是固定数字

time.Sleep(2 * time.Second)
time.AfterFunc(5*time.Second, func() { ... })  // 延迟执行

ticker := time.NewTicker(1 * time.Second)
for range ticker.C { ... }

八、测试与诊断

testing --- 单元测试与基准测试

go 复制代码
func TestAdd(t *testing.T) {
    if add(1, 2) != 3 {
        t.Errorf("expected 3, got %d", add(1, 2))
    }
}

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        add(1, 2)
    }
}
// go test -bench=. -cover

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

go 复制代码
slog.Info("user login", "user_id", uid, "ip", ip)
slog.Error("db failed", "err", err)
// 支持 JSON/Text 输出,可自定义 Handler

九、错误处理

errors --- 错误创建与检查

go 复制代码
errors.New("something failed")
errors.Is(err, targetErr)        // 错误链匹配
errors.As(err, &target)          // 类型断言
errors.Unwrap(err)               // 解包
fmt.Errorf("context: %w", err)   // 包装(%w 保留类型)

十、其他高频库

用途
os/exec 执行外部命令
flag 命令行参数解析
math/rand / crypto/rand 随机数(安全场景用 crypto)
sort 排序(1.21+ 被 slices 覆盖大部分场景)
math/big 大整数/高精度浮点
crypto/tls TLS 配置
crypto/sha256 哈希摘要
runtime GC 控制、goroutine 数量、CPU 核数
reflect 运行时反射(性能敏感场景慎用)
text/template 模板引擎
database/sql SQL 数据库接口(配合驱动如 pqmysql
embed(Go 1.16+) 编译时嵌入静态文件

最佳实践速查

  1. 错误处理 :永远 if err != nil,用 %w 包装保持错误链
  2. Context 优先 :HTTP handler、数据库调用、RPC 请求都传 ctx
  3. io.Copy 万能:文件拷贝、响应体转发,一行搞定
  4. defer 及时释放 :文件、锁、响应体都要 defer Close/Unlock
  5. strings.Builder 拼接字符串,比 + 拼接性能好
  6. sync.Pool 用于高频创建销毁的对象(如 []byte 缓冲区)
  7. Go 1.21+ 优先用 slicesmapslog/slog 等新泛型库
相关推荐
长栎23 分钟前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode27 分钟前
Redis 在生产项目的使用
前端·后端
用户5598224812231 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode32 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战33 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha1 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn1 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425911 小时前
ShardingJDBC
后端
行者全栈架构师1 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
Colin草率地做慢慢地改1 小时前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构