GO常用标准库包

常用标准库包实战:字符串、时间、文件、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
相关推荐
php@king1 小时前
hyperf初步认识和安装
后端
LEE1 小时前
别再堆 AGENTS.md 了:前端团队如何把 AI Coding 做成一套可执行的工程系统
前端·后端
geovindu1 小时前
python: Face Recognition
开发语言·后端·python·人脸识别
工具派1 小时前
markdown在线编辑器怎么选?渲染管线的3个坑和md转PDF跑版记录
前端·后端
平头哥技术团队1 小时前
Day 13 | 调 line-height 和 margin:三处间距让名片页脱离模板感
开发语言·前端·javascript·学习·html5
黑马程序员毕设2 小时前
基于Java的仪器管理系统设计与实现
java·开发语言·spring boot·后端·微信小程序
长大19882 小时前
执行计划看不懂?一文理清 Oracle CBO 优化器工作原理
后端
平头哥AI2 小时前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang
骇客野人2 小时前
SpringBoot电商购物车、结算、下单、库存方案设计与落地实施步骤
java·spring boot·后端