906 字
5 分钟
260714GO包与导入
GO包与导入
一、Go 的包(package)
Go 使用包(package)来组织和管理代码
- 每个
.go文件第一行必须声明所属包:package 包名 package main是特殊包:- 标识该包为可执行程序(编译后生成可运行文件)
- 程序入口:
main包中的main()函数,程序启动时自动执行main() - 非 main 包:是库包(被其他包引用,不能直接独立运行)
- 同一个目录下所有
.go文件 必须声明为同一个包;包名通常和目录名保持一致
二、import 导入
通过 import 引入外部包,调用格式:包名.函数名/类型名
1. 基础写法
import "fmt"import "sort"import "strings"2. 分组导入写法(推荐)
import ( "fmt" "sort" "strings")3. 导入规则
-
Go 强制规则:导入但未使用的包会直接编译报错,不是警告(Go 设计原则:避免冗余死代码)
-
下划线匿名导入:仅执行包初始化、调用包内
init()函数,不直接调用包内方法import _ "net/http/pprof"- 适用场景:数据库驱动注册、埋点/监控组件注册等,无需手动调用包内函数,只需完成初始化
4. 导入别名写法(补充)
import ( s "sort" // 自定义短别名 s 代替原包名 sort "fmt")调用时:s.Slice(...)
三、可见性规则(大小写控制导出/私有)
Go 没有 public / private 关键字,通过标识符首字母大小写控制跨包可见性
- ✅ 首字母大写 = 导出(public):可被外部其他包访问
// 可跨包调用func Factorial(n int) int { ... }var MaxSize = 100type Student struct {Name string // 大写字段:外部包可访问age int // 小写字段:仅本包可用}
- ✅ 首字母小写 = 包内私有(private):仅当前包内部可用,外部包无法访问
// 仅本包内部调用func helper() { ... }var count = 0type config struct { ... }
- 适用范围:函数、变量、常量、自定义类型、结构体字段等所有标识符
- 例:标准库
fmt.Println、sort.Ints、strings.ToUpper均为大写导出,可供外部调用
四、init() 初始化函数
特性
- 格式:
func init() {},无参数、无返回值,不能手动调用 - 执行时机:包被导入时自动执行,执行顺序:
被依赖导入包的 init() → 当前包的 init() → main()
- 用途:初始化包级全局变量、注册组件、加载配置、预处理等
- 刷题场景极少用到;工程开发(数据库驱动、中间件)很常用
- 同一个包内可写多个
init()函数,会按文件加载顺序依次自动执行
示例代码
package mainimport "fmt"
// 包级别全局变量var config string
// init 自动执行,在 main 之前运行func init() { config = "production" fmt.Println("init() 执行了,config =", config)}
func main() { fmt.Println("main() 执行了") fmt.Println("当前配置:", config)}五、多文件组织
- 同一目录、同一个
package的多个.go文件:可直接互相调用,无需额外 import - 可以拆分代码:如
utils.go(工具函数)、main.go(主逻辑),互相自由调用变量/函数 - 核心前提:所有文件开头包声明保持一致(如全部写
package main)
六、刷题常用标准库包一览
fmt:格式化输入输出(Printf / Println / Scan)sort:排序相关函数(sort.Slice、sort.Ints 等)strings:字符串处理(查找、分割、大小写转换、匹配)strconv:字符串与数值类型互相转换math:数学运算(max/min、开方、取整、常数 Pi)bufio:高效读取输入(读取整行、大数据输入)container/list:双向链表time:时间处理bytes:字节数组处理
260714GO包与导入
https://fuwari.vercel.app/posts/260714go包与导入/