📚 第07课:包与模块

Go基础 第1阶段·第7/7课

📋 本课目标

🔬 代码演示与验证

package main
import ("encoding/json";"fmt";"math/rand";"os";"path/filepath";"strconv";"strings";"time")
func main() {
    fmt.Println("=== strings ===")
    s:="Hello, Go Backend"; fmt.Printf("Contains Go:%t\n",strings.Contains(s,"Go"))
    fmt.Printf("Split:%v\n",strings.Split(s," "))
    fmt.Printf("Join:%s\n",strings.Join([]string{"a","b","c"},"-"))
    fmt.Printf("Upper:%s\n",strings.ToUpper(s))
    fmt.Println("\n=== strconv ===")
    fmt.Printf("Itoa(42):%s Atoi(123):%d\n",strconv.Itoa(42),func()int{n,_:=strconv.Atoi("123");return n}())
    fmt.Println("\n=== time ===")
    now:=time.Now(); fmt.Printf("当前:%s Unix:%d 年:%d\n",now.Format("2006-01-02 15:04:05"),now.Unix(),now.Year())
    fmt.Println("\n=== rand ===")
    r:=rand.New(rand.NewSource(time.Now().UnixNano())); fmt.Printf("随机:%d\n",r.Intn(100))
    fmt.Println("\n=== filepath ===")
    fmt.Printf("Join:%s Ext:%s Base:%s\n",filepath.Join("dir","file.txt"),filepath.Ext("main.go"),filepath.Base("/a/b/c"))
    fmt.Println("\n=== json ===")
    type User struct{Name string `json:"name"`;Age int `json:"age"`}
    u:=User{Name:"Go",Age:25}; b,_:=json.Marshal(u); fmt.Printf("Marshal:%s\n",b)
    var u2 User; json.Unmarshal(b,&u2); fmt.Printf("Unmarshal:%+v\n",u2)
    fmt.Println("\n=== os ===")
    fmt.Printf("HOME:%s PID:%d\n",os.Getenv("HOME"),os.Getpid())
}

🔍 运行验证

✅ 验证通过 — 实机运行结果:

=== strings ===
Contains Go:true
Split:[Hello, Go Backend]
Join:a-b-c
Upper:HELLO, GO BACKEND

=== strconv ===
Itoa(42):42 Atoi(123):123

=== time ===
当前:2026-05-19 16:35:24 Unix:1779179724 年:2026

=== rand ===
随机:80

=== filepath ===
Join:dir/file.txt Ext:.go Base:c

=== json ===
Marshal:{"name":"Go","age":25}
Unmarshal:{Name:Go Age:25}

=== os ===
HOME:/root PID:437684

🧠 包体系

标准库: fmt/strings/strconv/time/os/json/http 第三方: gin/gorm/redis 内部包: internal/ 只能父模块导入 自定义: 项目内目录

🔧 go mod

go mod init github.com/user/project
go get github.com/gin-gonic/gin@v1.9.1
go mod tidy  # 整理依赖
go mod vendor  # vendor模式

📊 标准库速查

功能
fmt格式化I/O
strings字符串操作
time时间日期
os操作系统
encoding/jsonJSON编解码
net/httpHTTP服务

🔑 本课要点回顾

知识点关键内容
包组织internal/可见性
go modinit/tidy/get/vendor
标准库fmt/strings/time/os/json/http
版本语义版本v1.2.3

🏋️ 练习

多包项目

internal+pkg结构

JSON处理

嵌套结构体+自定义时间

文件操作

os/io逐行读取

🏆

成就解锁:模块架构师!🎉 Go基础完成!

📖 标准库深入

io包 — I/O基础

// 读取全部
data, err := io.ReadAll(reader)

// 拷贝流
written, err := io.Copy(dst, src)

// Pipe — 内存管道
pr, pw := io.Pipe()
go func() { pw.Write(data); pw.Close() }()
result, _ := io.ReadAll(pr)

bufio包 — 缓冲I/O

// 逐行读取
scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

// 缓冲写入
writer := bufio.NewWriter(file)
writer.WriteString("hello")
writer.Flush()

regexp包 — 正则表达式

re := regexp.MustCompile(`\d+`)
matches := re.FindAllString("abc123def456", -1)  // ["123","456"]

📖 延伸阅读与资源

🎯 实战开发建议

  1. 动手编码 — 只看不练等于没学,每课代码必须自己敲一遍
  2. 使用go docgo doc fmt.Printf 查看标准库文档
  3. 编写测试go test 验证你的理解是否正确
  4. 阅读源码 — 标准库是Go最佳实践的活教材
  5. 项目实战 — 在真实项目中应用所学

⚡ Go性能优化清单

// 1. 预分配切片容量 — 避免频繁扩容
s := make([]int, 0, expectedSize)

// 2. strings.Builder拼接 — 比fmt.Sprintf快3-5倍
var b strings.Builder
b.WriteString("hello")
b.WriteString(" world")
result := b.String()

// 3. sync.Pool对象复用 — 减少GC压力
var bufPool = sync.Pool{
    New: func() interface{} { return new(bytes.Buffer) },
}
buf := bufPool.Get().(*bytes.Buffer)
defer bufPool.Put(buf)

// 4. 减少堆分配 — 小对象栈分配,避免逃逸
// 用 go build -gcflags="-m" 分析逃逸

// 5. 使用benchmark验证性能
func BenchmarkXxx(b *testing.B) {
    for i := 0; i < b.N; i++ {
        // 被测代码
    }
}
// go test -bench=. -benchmem

🔍 调试与排查技巧

// 1. 格式化调试输出
fmt.Printf("%+v
", myStruct)  // 带字段名
fmt.Printf("%#v
", myValue)   // Go语法表示

// 2. log包运行时日志
log.Printf("[DEBUG] value=%v", val)
log.SetFlags(log.LstdFlags | log.Lshortfile)

// 3. delve源码调试器
// 安装: go install github.com/go-delve/delve/cmd/dlv@latest
// 使用: dlv debug ./main.go
// 命令: break main.main / continue / next / print

// 4. pprof性能分析
import _ "net/http/pprof"
go http.ListenAndServe(":6060", nil)
// 访问: http://localhost:6060/debug/pprof/
// 命令: go tool pprof http://localhost:6060/debug/pprof/profile

// 5. race detector竞态检测
// go run -race main.go
// go test -race ./...

📊 Go工具生态

工具用途安装
golangci-lint代码静态检查go install github.com/golangci/golangci-lint/cmd/...@latest
gofumpt代码格式化(增强)go install mvdan.cc/gofumpt@latest
goimports自动管理importgo install golang.org/x/tools/cmd/goimports@latest
dlv源码调试器go install github.com/go-delve/delve/cmd/dlv@latest
air热重载开发go install github.com/cosmtrek/air@latest
swagSwagger文档生成go install github.com/swaggo/swag/cmd/swag@latest
migrate数据库迁移go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest

🏗️ Go项目结构最佳实践

myproject/
├── cmd/                    # 可执行程序入口
│   └── server/
│       └── main.go
├── internal/               # 私有代码(不可外部导入)
│   ├── handler/            # HTTP处理
│   ├── service/            # 业务逻辑
│   ├── repository/         # 数据访问
│   └── model/              # 数据模型
├── pkg/                    # 可复用公共包
│   └── utils/
├── api/                    # API定义(proto/openapi)
├── configs/                # 配置文件
├── scripts/                # 构建/部署脚本
├── test/                   # 集成测试
├── go.mod
├── go.sum
├── Makefile
└── Dockerfile

🌐 Go Web开发生态

类别推荐方案替代方案
Web框架GinEcho / Chi / Fiber
ORMGORMEnt / sqlx / sqlc
配置Viperkoanf
日志zapzerolog / slog
验证validatorgo-playground/validator
缓存go-redisredigo
JWTgolang-jwt
Swaggerswag
测试testify
Mockgomocktestify/mock

💡 编码规范

// 命名规范
// 包名: 小写单词, 不用下划线  package httputil
// 导出: 大写开头              func CreateUser()
// 未导出: 小写开头            func validateInput()
// 接口: -er后缀              type Reader interface{}
// 常量: 驼峰                 const maxRetries = 3
// 枚举: 类型+常量            type Role int; const Admin Role = 0

// 错误处理规范
// 错误变量: Err前缀           var ErrNotFound = errors.New("...")
// 错误类型: Error后缀         type ValidationError struct{...}
// 包装: %w                    fmt.Errorf("查询失败: %w", err)

// 注释规范
// 导出符号必须有注释
// 注释以符号名开头            // CreateUser creates a new user.
// 包注释: doc.go              // Package user handles user operations.

🔐 安全编码要点

// 1. 输入验证 — 永远不信任用户输入
// 2. SQL注入 — 使用参数化查询
db.Query("SELECT * FROM users WHERE id = $1", id)  // ✅
db.Query("SELECT * FROM users WHERE id = " + id)    // ❌

// 3. XSS防护 — HTML转义
template.HTML(escape(userInput))  // 或使用html/template自动转义

// 4. CSRF — 使用token验证
// 5. 密码 — bcrypt/argon2哈希, 永不明文存储
hashed, _ := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)

// 6. HTTPS — 生产环境必须
// 7. 日志脱敏 — 不记录密码/Token
log.Printf("user login: id=%d", userID)  // ✅
log.Printf("password=%s", pwd)            // ❌

📦 依赖管理规范

// go.mod最佳实践
module github.com/yourorg/yourproject

go 1.22

// 直接依赖 — 项目直接使用的包
require (
    github.com/gin-gonic/gin v1.9.1
    gorm.io/gorm v1.25.0
)

// 间接依赖 — 自动管理, 不要手动编辑
require (
    github.com/json-iterator/go v1.1.12 // indirect
)

// 替换 — 本地开发/ fork修复
replace github.com/original/pkg => ../local-fork

// 排除 — 排除有问题的版本
exclude github.com/broken/pkg v1.0.0