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 关键字,通过标识符首字母大小写控制跨包可见性

  1. 首字母大写 = 导出(public):可被外部其他包访问
    // 可跨包调用
    func Factorial(n int) int { ... }
    var MaxSize = 100
    type Student struct {
    Name string // 大写字段:外部包可访问
    age int // 小写字段:仅本包可用
    }
  2. 首字母小写 = 包内私有(private):仅当前包内部可用,外部包无法访问
    // 仅本包内部调用
    func helper() { ... }
    var count = 0
    type config struct { ... }
  • 适用范围:函数、变量、常量、自定义类型、结构体字段等所有标识符
  • 例:标准库 fmt.Printlnsort.Intsstrings.ToUpper 均为大写导出,可供外部调用

四、init() 初始化函数#

特性#

  1. 格式:func init() {},无参数、无返回值,不能手动调用
  2. 执行时机:包被导入时自动执行,执行顺序:

    被依赖导入包的 init() → 当前包的 init() → main()

  3. 用途:初始化包级全局变量、注册组件、加载配置、预处理等
    • 刷题场景极少用到;工程开发(数据库驱动、中间件)很常用
    • 同一个包内可写多个 init() 函数,会按文件加载顺序依次自动执行

示例代码#

package main
import "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包与导入/
作者
anh
发布于
2026-07-14
许可协议
CC BY-NC-SA 4.0