golang-基础-Go语言常用标准库
本文最后更新于 2025-07-25,文章内容可能已经过时。
Go语言的标准库(Standard Library)是其核心优势之一,提供了丰富的功能模块,涵盖从基础数据操作到网络编程、加密、并发控制等广泛领域。以下是Go语言标准库的详细分类及常用包的说明:
1. 数据处理
1.1 编码与序列化
encoding/...
:提供多种数据格式的编码/解码功能。encoding/json
:JSON数据的编码和解码。encoding/xml
:XML数据的编码和解码。encoding/gob
:Go特有的二进制序列化格式。encoding/base64
:Base64编码和解码。
hash/...
:哈希算法实现。hash/crc32
,hash/adler32
:校验和计算。hash/fnv
:FNV哈希算法。
bytes
:字节切片的操作(类似strings
包)。strconv
:字符串与基本数据类型(整型、浮点型等)的相互转换。
示例:
import "encoding/json"
data := map[string]int{"a": 1, "b": 2}
jsonBytes, _ := json.Marshal(data) // 转换为JSON字节
1.2 容器与集合
container/...
:提供常用数据结构。container/heap
:堆(优先队列)实现。container/list
:双向链表。container/ring
:环形缓冲区。
sort
:排序和搜索功能(支持自定义排序逻辑)。
示例:
heapDemo.go
-----------------------------
package d0
// 定义任务结构体
type Task struct {
ID int
Priority int
}
// 实现 heap.Interface 接口
type TaskHeap []Task
func (h TaskHeap) Len() int { return len(h) }
func (h TaskHeap) Less(i, j int) bool { return h[i].Priority > h[j].Priority } // 最大堆
func (h TaskHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
// Push 和 Pop 方法必须使用指针接收者
func (h *TaskHeap) Push(x interface{}) {
*h = append(*h, x.(Task))
}
func (h *TaskHeap) Pop() interface{} {
old := *h
n := len(old)
item := old[n-1]
*h = old[0 : n-1]
return item
}
//main.go
// 初始化任务堆
tasks := &d0.TaskHeap{
{ID: 1, Priority: 5},
{ID: 2, Priority: 3},
{ID: 3, Priority: 8},
}
heap.Init(tasks)
// 添加新任务
heap.Push(tasks, d0.Task{ID: 4, Priority: 2})
heap.Push(tasks, d0.Task{ID: 5, Priority: 7})
// 按优先级取出任务
for tasks.Len() > 0 {
task := heap.Pop(tasks).(d0.Task)
fmt.Printf("ID: %d, Priority: %d\n", task.ID, task.Priority)
}
//list
// 创建双向链表
l := list.New()
// 添加元素
e4 := l.PushBack(4) // 从尾部插入
e1 := l.PushFront(1) // 从头部插入
l.InsertBefore(3, e4) // 在 e4 前插入
l.InsertAfter(2, e1) // 在 e1 后插入
// 遍历链表
fmt.Println("Forward traversal:")
for e := l.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
// 反向遍历
fmt.Println("Backward traversal:")
for e := l.Back(); e != nil; e = e.Prev() {
fmt.Print(e.Value, " ")
}
fmt.Println()
// 创建一个大小为 5 的环形链表
r := ring.New(5)
// 为每个节点赋值
for i := 0; i < r.Len(); i++ {
r.Value = i
r = r.Next() // 移动到下一个节点
}
// 遍历环形链表
fmt.Println("Ring elements:")
r.Do(func(p interface{}) {
fmt.Print(p.(int), " ")
})
fmt.Println()
// 使用 Move 方法移动位置
newPos := r.Move(2) // 向前移动 2 个位置
fmt.Println("Elements starting from position 2:")
newPos.Do(func(p interface{}) {
fmt.Print(p.(int), " ")
})
// 1. 排序字符串切片
strs := []string{"banana", "apple", "cherry"}
sort.Strings(strs)
fmt.Println("Sorted strings:", strs)
// 2. 排序整数切片
ints := []int{5, 2, 9, 1}
sort.Ints(ints)
fmt.Println("Sorted integers:", ints)
// 3. 自定义排序(按结构体字段)
type Person struct {
Name string
Age int
}
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
// 使用 sort.Slice 自定义排序规则
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
fmt.Println("Sorted by age:", people)
// 4. 二分查找(需先排序)
index := sort.SearchInts([]int{1, 2, 3, 4, 5}, 3)
fmt.Println("Index of 3:", index)
2. 文件操作
2.1 基础文件操作
os
:操作系统接口(文件读写、进程管理等)。path/filepath
:跨平台的文件路径操作。io
:基础输入输出接口(如Reader
、Writer
)。bufio
:带缓冲的I/O操作(提高读写效率)。compress/...
:压缩与解压。compress/gzip
:GZIP压缩。compress/zlib
:ZLIB压缩。
示例:
// 创建文件
file, err := os.Create("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
// 写入内容
_, err = file.WriteString("Hello World,又是一只Gopher!\n")
if err != nil {
panic(err)
}
fmt.Println("File written successfully.")
// 获取环境变量
homeDir := os.Getenv("PATH")
fmt.Printf("Home directory: %s\n", homeDir)
// 设置环境变量(仅当前进程)
os.Setenv("MY_VAR", "123")
fmt.Printf("MY_VAR: %s\n", os.Getenv("MY_VAR"))
// 拼接路径(自动适配不同平台)
path := filepath.Join("data", "logs", "access.log")
fmt.Println("Constructed path:", path)
// 读取目录内容
dir, err := os.Open(".")
if err != nil {
panic(err)
}
defer dir.Close()
files, err := dir.Readdirnames(0) // 0 表示读取所有文件
if err != nil {
panic(err)
}
fmt.Println("Files in current directory:")
for _, f := range files {
fmt.Println(f)
}
//使用 io.Copy 复制文件
srcFile, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
dstFile, err := os.Create("destination.txt")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 使用 io.Copy 复制文件内容
_, err = io.Copy(dstFile, srcFile)
if err != nil {
panic(err)
}
//使用 bufio.Scanner 逐行读取
file, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println("Line:", scanner.Text())
}
if err := scanner.Err(); err != nil {
panic(err)
}
//GZIP 压缩与解压
// 打开源文件
srcFile, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 创建压缩文件
dstFile, err := os.Create("example.txt.gz")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 创建 GZIP Writer
gzipWriter := gzip.NewWriter(dstFile)
defer gzipWriter.Close()
// 复制并压缩数据
_, err = io.Copy(gzipWriter, srcFile)
if err != nil {
panic(err)
}
fmt.Println("File compressed successfully.")
//解压 GZIP 文件
// 打开压缩文件
srcFile, err := os.Open("example.txt.gz")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 创建 GZIP Reader
reader, err := gzip.NewReader(srcFile)
if err != nil {
panic(err)
}
defer reader.Close()
// 创建目标文件
dstFile, err := os.Create("example_unzipped.txt")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 解压并写入
_, err = io.Copy(dstFile, reader)
if err != nil {
panic(err)
}
fmt.Println("File decompressed successfully.")
//使用 ZLIB 压缩数据
// 打开源文件
srcFile, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 创建目标文件
dstFile, err := os.Create("example.txt.zlib")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 创建 ZLIB Writer
writer := zlib.NewWriter(dstFile)
defer writer.Close()
// 复制并压缩数据
_, err = io.Copy(writer, srcFile)
if err != nil {
panic(err)
}
fmt.Println("File compressed with ZLIB.")
//解压 ZLIB 文件
// 打开压缩文件
srcFile, err := os.Open("example.txt.zlib")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 创建 ZLIB Reader
reader, err := zlib.NewReader(srcFile)
if err != nil {
panic(err)
}
defer reader.Close()
// 创建目标文件
dstFile, err := os.Create("example_unzipped_zlib.txt")
if err != nil {
panic(err)
}
defer dstFile.Close()
// 解压并写入
_, err = io.Copy(dstFile, reader)
if err != nil {
panic(err)
}
fmt.Println("File decompressed with ZLIB.")
3. 网络通信
3.1 网络协议支持
net
:底层网络操作(TCP/UDP/HTTP等)。net/http
:HTTP客户端和服务端实现(构建Web应用的核心)。net/url
:URL解析和构造。net/smtp
:SMTP协议实现(发送邮件)。net/rpc
:远程过程调用(RPC)框架。net/http/httputil
:HTTP工具(如反向代理)。
示例:
//TCP
//TcpDemo.go
package d0
import (
"bufio"
"fmt"
"net"
"os"
)
// TCP 服务器
func StartTCPServer() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
defer listener.Close()
fmt.Println("TCP Server started on :8080")
conn, err := listener.Accept()
if err != nil {
panic(err)
}
defer conn.Close()
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
fmt.Printf("Received: %s\n", scanner.Text())
conn.Write([]byte("Message received\n"))
}
}
// TCP 客户端
func StartTCPClient() {
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
panic(err)
}
defer conn.Close()
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
conn.Write([]byte(input.Text() + "\n"))
resp, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Server response: " + resp)
}
}
//main
package main
import (
"errors"
"fmt"
"go-demo/d0"
"math"
)
func main() {
// 启动服务器和客户端(实际使用时应分两个独立程序运行)
go d0.StartTCPServer()
d0.StartTCPClient()
}
//HTTP 服务器
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!\n")
}
func main() {
http.HandleFunc("/", helloHandler)
fmt.Println("HTTP Server started on :8080")
http.ListenAndServe(":8080", nil)
}
//HTTP 客户端发送 GET 请求
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, err := http.Get("http://localhost:8080")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println("Response Body:", string(body))
}
//解析和构造 URL
package main
import (
"fmt"
"net/url"
)
func main() {
// 解析 URL
rawURL := "https://example.com/path?query=123#fragment"
u, err := url.Parse(rawURL)
if err != nil {
panic(err)
}
fmt.Println("Scheme:", u.Scheme)
fmt.Println("Host:", u.Host)
fmt.Println("Path:", u.Path)
fmt.Println("Query:", u.Query().Get("query")) // 获取查询参数
fmt.Println("Fragment:", u.Fragment)
// 构造 URL
base, _ := url.Parse("https://example.com")
query := base.Query()
query.Set("page", "2")
base.RawQuery = query.Encode()
fmt.Println("Constructed URL:", base.String())
}
//通过 SMTP 发送邮件
package main
import (
"fmt"
"net/smtp"
)
func main() {
// 邮件配置
from := "sender@example.com"
to := []string{"recipient@example.com"}
subject := "Test Email"
body := "This is a test email sent via Go."
// SMTP 服务器配置(示例使用 Gmail)
smtpHost := "smtp.gmail.com"
smtpPort := "587"
auth := smtp.PlainAuth("", from, "your-password", smtpHost)
// 构造邮件
msg := []byte("To: " + to[0] + "\r\n" +
"Subject: " + subject + "\r\n" +
"\r\n" +
body + "\r\n")
// 发送邮件
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg)
if err != nil {
panic(err)
}
fmt.Println("Email sent successfully.")
}
//RpcDemo.go
package d0
// 定义 RPC 参数结构体(字段首字母大写)
type Args struct {
A int
B int
}
// 定义 RPC 服务类型
type Arith int
// 实现 RPC 方法
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
////RPC 服务器
//main
package main
import (
"errors"
"fmt"
"go-demo/d0"
"math"
)
func main() {
arith := new(d0.Arith)
rpc.Register(arith) // 注册 RPC 服务
rpc.HandleHTTP() // 启用 HTTP 协议支持
fmt.Println("RPC Server started on :1234")
http.ListenAndServe(":1234", nil) // 使用 HTTP 监听
}
//RPC 客户端
package main
import (
"fmt"
"go-demo-client/d0"
"net/rpc"
)
func main() {
client, err := rpc.DialHTTP("tcp", "localhost:1234")
if err != nil {
panic(err)
}
args := &d0.Args{A: 3, B: 4} // 创建参数
var reply int
// 调用 RPC 方法(服务名.Method名)
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
panic(err)
}
fmt.Printf("Multiply result: %d\n", reply)
}
4. 加密与安全
4.1 加密算法
crypto/...
:加密算法实现。crypto/md5
,crypto/sha1
,crypto/sha256
:哈希算法。crypto/aes
,crypto/rsa
:对称/非对称加密。crypto/tls
:TLS/SSL协议支持。crypto/x509
:X.509证书解析。
crypto/rand
:生成加密安全的随机数。
示例:
import "crypto/sha256"
hash := sha256.Sum256([]byte("Hello World,又是一只Gopher!"))
fmt.Printf("%x", hash)
5. 并发与同步
5.1 并发控制
sync
:并发原语(互斥锁、等待组等)。sync.Mutex
,sync.RWMutex
:互斥锁。sync.WaitGroup
:等待goroutine完成。sync.Once
:确保函数只执行一次。
sync/atomic
:原子操作(用于无锁并发)。runtime
:运行时控制(如goroutine调度)。runtime/pprof
:性能分析工具(CPU/内存剖析)。
示例:
//sync.Mutex 互斥锁
//MutexDemo.go
package d0
import "sync"
type Counter struct {
mu sync.Mutex
value int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
func (c *Counter) Value() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.value
}
//main
package main
import (
"fmt"
"go-demo-client/d0"
"sync"
)
func main() {
var counter d0.Counter
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Increment()
}()
}
wg.Wait()
fmt.Println("Final Counter Value:", counter.Value()) // 输出 1000
}
//sync.RWMutex 读写互斥锁
//RWMutexDemo.go
package d0
import "sync"
type Cache struct {
mu sync.RWMutex
Data map[string]string
}
func (c *Cache) Get(key string) string {
c.mu.RLock()
defer c.mu.RUnlock()
return c.Data[key]
}
func (c *Cache) Set(key, value string) {
c.mu.Lock()
defer c.mu.Unlock()
c.Data[key] = value
}
//main
package main
import (
"fmt"
"go-demo-client/d0"
"time"
)
func main() {
cache := &d0.Cache{Data: make(map[string]string)}
// 写操作
go cache.Set("key", "value666")
// 读操作
time.Sleep(time.Millisecond) // 确保写操作先执行
fmt.Println("Read value:", cache.Get("key")) // 输出 value666
}
//sync.WaitGroup 等待组
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers completed")
}
//sync.Once 单次执行
//OnceDemo.go
package d0
import (
"fmt"
"sync"
)
var once sync.Once
var Instance *Singleton
type Singleton struct{}
func GetInstance() *Singleton {
once.Do(func() {
Instance = &Singleton{}
fmt.Println("Creating singleton instance")
})
return Instance
}
//main
package main
import (
"fmt"
"go-demo-client/d0"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
d0.GetInstance()
}()
}
wg.Wait()
fmt.Println("Final instance:", d0.Instance)
}
//sync/atomic 原子操作
package main
import (
"fmt"
"runtime"
"sync/atomic"
)
var counter int64
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt64(&counter, 1)
}()
}
wg.Wait()
fmt.Println("Final Counter Value:", counter) // 输出 1000
}
//runtime 调度控制
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// 设置最大处理器数
runtime.GOMAXPROCS(2)
// 启动多个goroutine
for i := 0; i < 3; i++ {
go func(id int) {
for {
fmt.Printf("Goroutine %d is running\n", id)
runtime.Gosched() // 主动让出CPU时间片
time.Sleep(time.Millisecond * 100)
}
}(i)
}
// 防止主函数退出
time.Sleep(time.Second * 5)
}
//runtime/pprof 性能分析
package main
import (
"runtime"
"runtime/pprof"
"os"
"time"
"sync"
)
func main() {
// 创建CPU profile文件
f, err := os.Create("cpu.prof")
if err != nil {
panic(err)
}
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// 创建内存 profile 文件
mf, err := os.Create("mem.prof")
if err != nil {
panic(err)
}
defer mf.Close()
defer pprof.WriteHeapProfile(mf)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second)
}()
}
wg.Wait()
}
6. 时间与定时
time
:时间处理(获取当前时间、定时器、延时等)。time.Now()
:获取当前时间。time.Sleep()
:延时。time.Ticker
:周期性定时器。time.Parse
:时间格式化。
示例:
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间
now := time.Now()
// 以默认格式输出时间(可读性较强)
fmt.Println("当前时间(默认格式):", now)
// 使用特定格式格式化输出时间
// 参考时间格式为 "2006-01-02 15:04:05"
formattedTime := now.Format("2006-01-02 15:04:05")
fmt.Println("当前时间(自定义格式):", formattedTime)
// 获取 Unix 时间戳(秒)
unixTimestamp := now.Unix()
fmt.Println("Unix 时间戳(秒):", unixTimestamp)
}
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("开始等待...")
// 延迟 2 秒
time.Sleep(2 * time.Second)
fmt.Println("等待结束!")
}
//time.Ticker:周期性定时器
package main
import (
"fmt"
"time"
)
func main() {
// 创建一个每 500 毫秒触发一次的定时器
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
// 定义一个计数器,触发 3 次后退出
count := 0
maxCount := 3
for {
// 从定时器的 Channel 接收时间信号
<-ticker.C
count++
fmt.Println("定时器触发第", count, "次,当前时间:", time.Now().Format("15:04:05"))
// 达到指定次数后退出循环
if count >= maxCount {
break
}
}
}
//time.Parse:字符串解析为时间
package main
import (
"fmt"
"time"
)
func main() {
// 定义一个时间字符串
dateString := "2023-10-05 14:30:00"
// 定义与时间字符串匹配的布局
// 注意:布局必须基于参考时间 "2006-01-02 15:04:05"
layout := "2006-01-02 15:04:05"
// 解析时间字符串
parsedTime, err := time.Parse(layout, dateString)
if err != nil {
fmt.Println("解析失败:", err)
return
}
// 输出解析后的时间
fmt.Println("解析后的时间:", parsedTime)
fmt.Println("格式化后的时间:", parsedTime.Format("2006-01-02 15:04:05"))
}
//错误处理示例(解析失败)
package main
import (
"fmt"
"time"
)
func main() {
dateString := "2023/10/05 14:30:00" // 使用斜杠分隔符
layout := "2006-01-02 15:04:05" // 与字符串格式不一致
parsedTime, err := time.Parse(layout, dateString)
if err != nil {
fmt.Println("解析失败:", err)
return
}
fmt.Println("解析后的时间:", parsedTime)
}
7. 文本处理
7.1 字符串与正则
strings
:字符串操作(查找、替换、分割等)。unicode/utf8
:UTF-8编码处理。regexp
:正则表达式匹配。text/template
:文本模板生成(支持变量替换)。
示例:
import "strings"
fmt.Println(strings.Replace("hello world", "world", "Go", -1))
8. 其他实用工具
fmt
:格式化输入输出(如fmt.Println
、fmt.Sprintf
)。log
:日志记录(支持文件日志、日志级别)。errors
:错误处理(errors.New
、fmt.Errorf
)。math
:数学函数(三角函数、指数运算等)。flag
:命令行参数解析。context
:上下文管理(用于取消goroutine或传递请求范围的值)。
示例:
import "fmt"
fmt.Printf("Name: %s, Age: %d\n", "Alice", 30)
9. 测试与调试
testing
:单元测试框架(支持基准测试、覆盖率分析)。testify/assert
:第三方断言库(常与testing
配合使用)。go test
:命令行工具(运行测试、生成覆盖率报告)。
示例:
import "testing"
func TestAdd(t *testing.T) {
if Add(2, 3) != 5 {
t.Fail()
}
}
10. HTML处理
html
:HTML转义与模板处理。html.EscapeString
:防止XSS攻击的HTML转义。html/template
:安全生成HTML内容(自动转义特殊字符)。
示例:
import "html"
fmt.Println(html.EscapeString("<script>alert('xss')</script>"))
// 输出: <script>alert('xss')</script>
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果