Skip to main content

标准库常用

先熟悉高频标准库,减少「造轮子」冲动。

fmt / strings / strconv

fmt.Printf("%s=%d\n", "n", 3)
s := fmt.Sprintf("id=%d", 7)

strings.Contains("hello", "ll")
strings.Split("a,b,c", ",")
strings.Join([]string{"a", "b"}, "-")
strings.TrimSpace(" x ")

n, err := strconv.Atoi("42")
t := strconv.Itoa(42)

格式化动词常用:%v 默认、%+v 结构体带字段名、%#v Go 语法、%w 仅用于 Errorf 包装错误。

io / os / path/filepath

data, err := os.ReadFile("a.txt")
if err != nil {
return err
}
err = os.WriteFile("b.txt", data, 0o644)

f, err := os.Open("a.txt")
if err != nil {
return err
}
defer f.Close()
io.Copy(os.Stdout, f)

路径处理优先 filepath(适配 OS 分隔符):

filepath.Join("dir", "file.txt")
filepath.Base("/tmp/a.txt")

io.Reader / io.Writer 是生态枢纽:文件、网络、缓冲区都实现它们,函数参数尽量收接口。

net/http 极简示例

客户端:

resp, err := http.Get("https://example.com")
if err != nil {
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)

服务端:

http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "ok")
})
log.Fatal(http.ListenAndServe(":8080", nil))

生产环境应设置超时、使用自己的 http.Client / http.Server,并配合下一节的 context

context 入门

context.Context 在调用链上传递取消、截止时间与请求级值

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://example.com", nil)
if err != nil {
return err
}
resp, err := http.DefaultClient.Do(req)
select {
case <-ctx.Done():
return ctx.Err() // context.Canceled / DeadlineExceeded
case result := <-work:
return result
}

约定:ctx 作函数第一个参数;不要塞进结构体长期存;值传递用 WithValue 要克制(中间件请求 ID 等)。

小结

  1. 字符串与数字转换看 strings / strconv;打印用 fmt
  2. 文件与拷贝围绕 os + io
  3. HTTP 先会 Get / HandleFunc,再收紧 Client/Server
  4. 跨 API 取消与超时统一走 context

上一篇:错误处理 · 下一篇:测试与工具