常用标准库包实战:字符串、时间、文件、JSON、HTTP 一次讲清
学 Go 时最常听到的一句话就是"Go 的标准库很强大"。
这篇博客选了日常开发里最常用的 11 个标准库包
什么是标准库?
标准库就是 Go 语言自带 的、不用额外下载的库。你只需要 import 就能用。装好 Go 就有,断网也能用。
怎么查标准库的用法?
- 本地终端:
go doc fmt(想看哪个包就换哪个) - 在线文档:https://pkg.go.dev (Go 官方文档,最权威)
1. fmt:打印和格式化
这是你用到的第一个包,也是最常用的。
go
package main
import "fmt"
func main() {
name := "小明"
age := 20
fmt.Println("大家好") // 直接打印,自动换行
fmt.Printf("我叫%s,今年%d岁\n", name, age) // 格式化打印:%s 字符串,%d 整数
s := fmt.Sprintf("我叫%s,今年%d岁", name, age) // 格式化但不打印,存进变量
fmt.Println(s)
}
常用占位符:
| 占位符 | 含义 | 例子 |
|---|---|---|
%s |
字符串 | "你好" |
%d |
整数 | 42 |
%f |
小数 | 3.14 |
%v |
什么类型都行(新手福音) | fmt.Printf("%v", 任意值) |
什么时候用:想往屏幕上打印东西、拼字符串的时候。
2. strings:字符串处理工具包
判断、截取、拆分、拼接字符串,都靠它。
go
package main
import (
"fmt"
"strings"
)
func main() {
s := "hello, go world"
fmt.Println(strings.Contains(s, "go")) // 是否包含子串:true
fmt.Println(strings.HasPrefix(s, "hello")) // 是否以某开头:true
fmt.Println(strings.HasSuffix(s, "world")) // 是否以某结尾:true
parts := strings.Split(s, ", ") // 按分隔符拆成切片
fmt.Println(parts) // [hello go world]
fmt.Println(strings.Join(parts, " | ")) // 把切片拼成字符串
fmt.Println(strings.ToUpper(s)) // 转大写
fmt.Println(strings.TrimSpace(" 你好 ")) // 去掉首尾空格
}
3. strconv:字符串和数字互转
从命令行、文件、网页里拿到的数据都是字符串,要算数就得先转成数字。
go
package main
import (
"fmt"
"strconv"
)
func main() {
// 字符串 → 整数(注意:会返回两个值,第二个是错误)
num, err := strconv.Atoi("42")
if err != nil {
fmt.Println("转换失败:", err)
return
}
fmt.Println(num + 1) // 43,说明真的是数字了
// 整数 → 字符串
s := strconv.Itoa(42)
fmt.Println(s + "号") // 42号
// 字符串 → 小数
f, _ := strconv.ParseFloat("3.14", 64)
fmt.Println(f + 0.01) // 3.15
}
什么时候用:用户输入、读取配置文件、解析接口返回的字符串时。
4. time:时间和日期
go
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now) // 2026-09-06 22:30:00 +0800 CST
// 格式化:记住参考时间 "2006-01-02 15:04:05"
fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Format("2006年01月02日"))
// 解析字符串为时间
t, _ := time.Parse("2006-01-02", "2026-01-01")
fmt.Println(t) // 2026-01-01 00:00:00 +0000 UTC
// 时间计算:加一天
future := now.Add(24 * time.Hour)
fmt.Println(future.Format("2006-01-02 15:04:05"))
// 睡 1 秒
time.Sleep(time.Second)
fmt.Println("睡醒了")
}
Go 里最反直觉的一个知识点 :格式化时间的写法是
"2006-01-02 15:04:05",不是"yyyy-MM-dd"。
5. os:文件和文件夹
go
package main
import (
"fmt"
"os"
)
func main() {
// 写文件(0644 是文件权限,默认记这个就行)
err := os.WriteFile("hello.txt", []byte("你好,Go!\n"), 0644)
if err != nil {
fmt.Println("写入失败:", err)
return
}
// 读文件
data, err := os.ReadFile("hello.txt")
if err != nil {
fmt.Println("读取失败:", err)
return
}
fmt.Println(string(data)) // 你好,Go!
// 判断文件是否存在
_, err = os.Stat("hello.txt")
if err == nil {
fmt.Println("文件存在")
} else if os.IsNotExist(err) {
fmt.Println("文件不存在")
}
}
注意 :老教程里的
ioutil.ReadFile/ioutil.WriteFile已经过时了,新版 Go 直接用os.ReadFile/os.WriteFile就行。
6. bufio:逐行读大文件
os.ReadFile 是一次性把整个文件读进内存,文件很大时会卡。逐行读才是处理大文件的正确姿势。
go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// 先造一个几行的文件
os.WriteFile("data.txt", []byte("第一行\n第二行\n第三行\n"), 0644)
// 打开文件
file, err := os.Open("data.txt")
if err != nil {
fmt.Println("打开失败:", err)
return
}
defer file.Close() // 用 defer 保证最后关文件,别忘!
// 逐行读取
scanner := bufio.NewScanner(file)
lineNum := 1
for scanner.Scan() {
fmt.Printf("第%d行:%s\n", lineNum, scanner.Text())
lineNum++
}
}
什么时候用:读日志文件、CSV 数据、任何"可能很大"的文本文件时,都用逐行读。
7. log:正经的日志输出
fmt.Println 打印的东西没有时间戳、看不出是哪个文件,排查问题很痛苦。日志要用 log 包。
go
package main
import "log"
func main() {
log.Println("这是一条日志") // 自动带时间戳
log.Printf("用户%s登录成功", "小明")
// 加上文件名和行号,出问题时一眼定位
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("再看这条")
// Fatal:打印日志并直接结束程序(严重错误才用)
// log.Fatal("程序崩了")
}
什么时候用:程序里所有需要留痕的地方。区别:
fmt.Println是给人看的,log.Println是给排查问题看的。
8. encoding/json:JSON 和结构体互转
现在的程序几乎都要和 JSON 打交道(接口返回、配置文件、数据库)。
go
package main
import (
"encoding/json"
"fmt"
)
// 结构体字段后面的 `json:"名字"` 叫标签,控制 JSON 里的字段名
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
Score float64 `json:"score"`
}
func main() {
// 结构体 → JSON(序列化)
s := Student{Name: "小明", Age: 20, Score: 98.5}
data, err := json.Marshal(s)
if err != nil {
fmt.Println("转换失败:", err)
return
}
fmt.Println(string(data)) // {"name":"小明","age":20,"score":98.5}
// JSON → 结构体(反序列化)
jsonStr := `{"name":"小红","age":19,"score":95}`
var s2 Student
err = json.Unmarshal([]byte(jsonStr), &s2)
if err != nil {
fmt.Println("解析失败:", err)
return
}
fmt.Println(s2.Name, s2.Age, s2.Score) // 小红 19 95
}
什么时候用:写接口、调接口、读 JSON 配置文件时。
9. net/http:三行代码起一个网站
Go 最出名的优势之一:标准库自带 Web 服务器,不用装任何框架。
go
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "你好,Go 世界!")
}
func main() {
http.HandleFunc("/", hello) // 访问 / 时调用 hello 函数
fmt.Println("服务已启动:http://localhost:8080")
http.ListenAndServe(":8080", nil) // 监听 8080 端口,启动服务器
}
运行后打开浏览器访问 http://localhost:8080,就能看到"你好,Go 世界!"。发 HTTP 请求也一样简单:
go
resp, err := http.Get("https://api.github.com")
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close()
fmt.Println("状态码:", resp.StatusCode) // 200
什么时候用:写接口、爬虫、调用第三方 API 时。Web 框架(Gin 等)都是在
net/http基础上封装的。
10. sort:排序
go
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{5, 2, 8, 1, 9}
sort.Ints(nums)
fmt.Println(nums) // [1 2 5 8 9]
names := []string{"bob", "alice", "tom"}
sort.Strings(names)
fmt.Println(names) // [alice bob tom]
// 自定义排序:按年龄从小到大
people := []struct{ name string; age int }{
{"小明", 20}, {"小红", 19}, {"小刚", 22},
}
sort.Slice(people, func(i, j int) bool {
return people[i].age < people[j].age
})
fmt.Println(people) // [{小红 19} {小明 20} {小刚 22}]
}
什么时候用:排行榜、列表展示前排序。
sort.Slice里的函数就是"谁排在前面"的判断规则。
11. flag:接收命令行参数
给程序传参数,比如 go run main.go -name 小红 -age 19。
go
package main
import (
"flag"
"fmt"
)
func main() {
// 定义参数:名字、默认值、说明
name := flag.String("name", "小明", "你的名字")
age := flag.Int("age", 20, "你的年龄")
flag.Parse() // 解析命令行参数,必须调用
fmt.Printf("你好,%s,今年%d岁\n", *name, *age)
}
运行:
bash
go run main.go -name 小红 -age 19
# 输出:你好,小红,今年19岁
什么时候用:写命令行工具、配置程序启动参数时。注意取值的写法是
*name(因为返回的是指针)。
12. 总结:常用包速查表
| 包 | 干什么的 | 最常用的函数 |
|---|---|---|
fmt |
打印、格式化 | Println / Printf / Sprintf |
strings |
字符串处理 | Contains / Split / Join / TrimSpace |
strconv |
字符串↔数字 | Atoi / Itoa / ParseFloat |
time |
时间日期 | Now / Format / Sleep |
os |
文件、系统 | ReadFile / WriteFile / Stat |
bufio |
逐行读文件 | NewScanner / Scan / Text |
log |
日志 | Println / Printf / Fatal |
encoding/json |
JSON 互转 | Marshal / Unmarshal |
net/http |
Web 服务器、请求 | HandleFunc / ListenAndServe / Get |
sort |
排序 | Ints / Strings / Slice |
flag |
命令行参数 | String / Int / Parse |
标准库还有 regexp(正则)、sync(并发)、crypto(加密)等更多包,但先把上面这 11 个用熟,你已经能写不少实用小工具了。
如果这篇博客对你有帮助,欢迎点赞收藏~
下一篇可以聊聊第三方库(比如 Gin 框架)怎么用,想看的话评论区告诉我。
参考资料
- Go 官方标准库文档(权威,推荐常查)--- https://pkg.go.dev/std
- 本地文档:终端执行
go doc 包名(如go doc strings)