标准库常用
先熟悉高频标准库,减少「造轮子」冲动。
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 等)。
小结
- 字符串与数字转换看
strings/strconv;打印用fmt - 文件与拷贝围绕
os+io - HTTP 先会
Get/HandleFunc,再收紧 Client/Server - 跨 API 取消与超时统一走
context