Skip to content

package

Phase 01 — Go Fundamentals · 知识点 03


1. 学习目标

  • 理解 package 声明与 import
  • 区分可执行程序(main)与库包
  • 掌握导出规则:大写公开、小写私有
  • 组织多文件同包项目

2. 为什么需要

Go 通过 package 组织代码,避免全局命名冲突,控制可见性。每个 .go 文件属于一个 package,类似 ES Module,但机制是编译期的。


3. 核心概念

go
package main   // 文件所属包

import (
    "fmt"                          // 标准库
    "github.com/you/agv/models"    // 第三方/本地包
)
规则说明
同目录同 package一个文件夹内所有 .go 文件 package 名相同
大写导出func GetDevice() 可被其他包调用
小写私有func parseConfig() 仅包内可见
main 包func main() 可编译为可执行文件

4. 基础语法

agv-server/
├── go.mod
├── main.go          // package main
└── device/
    └── agv.go       // package device

device/agv.go

go
package device

type AGV struct {
    ID string
}

func NewAGV(id string) *AGV {
    return &AGV{ID: id}
}

main.go

go
package main

import (
    "fmt"
    "github.com/you/agv-server/device"
)

func main() {
    agv := device.NewAGV("AGV-001")
    fmt.Println(agv.ID)
}

5. 代码解析

  • import 路径 = module path + 子目录
  • 使用 device.NewAGV 而非 NewAGV(包名前缀)
  • 包名通常与目录名一致,但可以不同(不推荐)

6. JavaScript / TypeScript 对比

GoJS/TS
package + importES module import/export
大写/小写控制可见性export / 不 export
无 default export常用 named export

Go 没有 export 关键字,靠首字母大小写决定可见性——这是 JS 开发者最容易忽略的规则。


7. 常见错误

  1. import 未使用 → 编译错误(Go 强制)
  2. 循环 import → 编译错误,需重构
  3. package 名与目录不一致 → 可读性差
  4. 在 main 包写业务逻辑 → 应拆到独立 package

8. 实际应用

数字孪生项目分层:

cmd/server/main.go      → 入口
internal/device/        → 设备逻辑(小写目录,internal 包外不可 import)
internal/api/           → HTTP 处理
pkg/models/             → 可复用模型(可选)

9. 深入理解

  • internal/ 目录:Go 编译器强制,外部 module 无法 import
  • 标准库 import 路径无域名:"fmt""net/http"
  • 匿名 import _ "github.com/lib/pq" 仅执行 init,不使用包内符号

10. 练习

  • L1:创建两文件同 package main
  • L2:创建 device 包并在 main 中调用
  • L3:验证大小写导出规则
  • L4:搭建 agv-server 基础目录结构

11. 学习检查

  • [ ] 如何导出函数?
  • [ ] main 包与普通包区别?
  • [ ] internal 有何特殊?

12. 下一步

array / slice:在 package 内使用复合数据类型


学习导航

上一篇:go mod · 对应练习 · 下一篇:Variables and Types