Go基础--包和模块

包和模块

一、概念

  • 一个存储库(repository) 包含一个或多个模块(module)
  • 模块是一起发布的相关Go包(package) 的集合
  • 项目中的 依赖(Dependency),就是对其他模块的依赖(在go.mod中定义了模块的路径)

1.1.Package

pacakge的特点:

  • Pacakge是同一目录中一起编译的源文件的集合
  • 在一个源文件中定义的函数,类型,变量和常量对于同一包中的所有其他源文件可见
  • 代码的package和所在的目录名称可以不一致
  • 同一目录的Go代码的package要保持一致

1.2.Main Package

  • 一个go程序以main包中的main函数为入口
  • main包必须有main函数
  • main函数无参无返回值

1.3.Package init方法

  • 在main被执行前,所有依赖的package的init方法都会被执行
  • 不同包的init函数按照包导入的依赖关系决定执行顺序
  • 每个包可以有多个init函数
  • 包的源文件也可以有多个init函数

1.4.go程序执行顺序

按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程

  1. 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次(因此init方法只会执行一次)
  2. 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数
  3. 在完成这一切之后,main 也执行同样的过程,最后调用 main 函数开始执行程序

在加载的时候,会自动梳理好依赖顺序(包括变量、导入的包)

1
2
3
4
5
6
7
8
var a = b +c
var b = f(c)
var c = 1

func f(x int) int{
return x + 1
}
// 先初始化c,然后函数f,然后b,然后a

二、go mod

2.1.go mod基本操作

1
2
3
4
5
6
7

# 初始化
go mod init demo

# 拉依赖
go mod tidy

2.2.go mod vendor

执行该命令后,会在本地生成一个vendor目录,可以把其他要修改的源码放在这个目录下自行维护

Refs