包基础 #
一、包概述 #
Go程序由包组成,每个Go文件都属于一个包。
二、包定义 #
2.1 包声明 #
go
package main
package utils
package models
2.2 包命名规范 #
- 小写字母
- 简短、有意义
- 不使用下划线
go
package httputil
package json
package sql
2.3 目录结构 #
text
myapp/
├── main.go (package main)
├── utils/
│ └── helper.go (package utils)
└── models/
└── user.go (package models)
三、包导入 #
3.1 基本导入 #
go
import "fmt"
import "os"
// 或批量导入
import (
"fmt"
"os"
)
3.2 别名导入 #
go
import f "fmt"
f.Println("Hello")
3.3 匿名导入 #
go
import _ "github.com/lib/pq" // 执行init函数
3.4 点导入 #
go
import . "fmt"
Println("Hello") // 不需要前缀
四、可见性规则 #
4.1 导出标识符 #
首字母大写的标识符可导出:
go
package utils
var PublicVar int // 导出
var privateVar int // 未导出
func PublicFunc() {} // 导出
func privateFunc() {} // 未导出
type PublicType struct { // 导出
PublicField int // 导出
privateField int // 未导出
}
4.2 访问规则 #
go
package main
import "myapp/utils"
func main() {
utils.PublicVar = 1 // 正确
utils.PublicFunc() // 正确
// utils.privateVar = 1 // 错误:未导出
}
五、包初始化 #
5.1 init函数 #
go
package utils
func init() {
fmt.Println("utils initialized")
}
5.2 初始化顺序 #
- 包级变量初始化
- init函数执行
- main函数执行
go
package main
var a = initA()
func initA() int {
fmt.Println("init a")
return 1
}
func init() {
fmt.Println("init")
}
func main() {
fmt.Println("main")
}
// 输出:
// init a
// init
// main
5.3 多个init #
go
package main
func init() {
fmt.Println("init 1")
}
func init() {
fmt.Println("init 2")
}
六、包组织 #
6.1 标准库包 #
go
import (
"fmt"
"os"
"net/http"
"encoding/json"
)
6.2 第三方包 #
go
import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
6.3 内部包 #
go
import "myapp/internal/database"
七、实际应用 #
7.1 工具包 #
go
package utils
import "strings"
func TrimSpace(s string) string {
return strings.TrimSpace(s)
}
func Contains(s, substr string) bool {
return strings.Contains(s, substr)
}
7.2 模型包 #
go
package models
type User struct {
ID int
Name string
Email string
}
func NewUser(name, email string) *User {
return &User{
Name: name,
Email: email,
}
}
7.3 配置包 #
go
package config
var (
Host string
Port int
Database string
)
func init() {
Host = "localhost"
Port = 8080
Database = "mydb"
}
八、最佳实践 #
8.1 包命名 #
go
// 好
package httputil
package json
// 不好
package httpUtil
package json_utils
8.2 包组织 #
text
myapp/
├── cmd/ # 可执行程序
│ └── myapp/
│ └── main.go
├── internal/ # 私有代码
│ └── service/
├── pkg/ # 公开代码
│ └── utils/
└── go.mod
8.3 循环导入 #
避免循环导入:
go
// 错误:A导入B,B导入A
package a
import "myapp/b"
package b
import "myapp/a"
九、总结 #
包基础要点:
| 特性 | 说明 |
|---|---|
| 包声明 | package关键字 |
| 导入 | import关键字 |
| 可见性 | 首字母大小写 |
| init | 初始化函数 |
关键点:
- 包声明:每个文件必须声明所属包
- 可见性:首字母大写导出,小写私有
- init函数:包初始化时自动执行
- 导入方式:标准导入、别名、匿名、点导入
- 循环导入:避免循环导入
准备好学习Go Modules了吗?让我们进入下一章!
最后更新:2026-03-26