what
每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成 通常目录名
package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。 package main包下可以有多个文件,但所有文件中只能有一个main()方法,main()方法代表程序入口。
导入
1 |
|
1 |
|
_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数。
本包
在本包范围内 定义或声明 0 个或多个常量(const)、变量(var)和类型(type),这些对象的作用域都是全局的
导出
首字母大写才能在包外用
项目结构
1 |
|
- $GOPATH/src 存储源代码 $GOPATH/src/工程名
- pkg子目录用于保存编译后的包的目标文件
- bin子目录用于保存编译后的可执行程序
- GOROOT用来指定Go的安装目录 自带的标准库包的位置 目录结构和GOPATH类似
内部包
internal
包的内容只能被同一个父目录的包导入
net/http/internal/chunked内部包只能被net/http/httputil或net/http包导入, 但是不能被net/url包导入。不过net/url包却可以导入net/http/httputil包。
vendor
在执行 go build 或 go run 命令时,会按照以下顺序去查找包:
- 当前包下的 vendor 目录
- 向上级目录查找,直到找到 src 下的 vendor 目录
- 在 GOROOT 目录下查找
- 在 GOPATH 下面查找依赖包
cd $GOPATH/src/工程名/vendor
程序启动流程
- 程序的初始化和执行都起始于main包
- main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次
- 当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化
- 执行init函数(如果有的话)
- 等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化
- 执行main包中的init函数(如果存在的话),最后执行main函数。
关于init
- init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 每个包可以拥有多个init函数
- 包的每个源文件也可以拥有多个init函数
- 同一个包中多个init函数的执行顺序Go语言没有明确的定义(说明)
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
mod
依赖包的存放位置变更为$GOPATH/pkg 允许同一个package多个版本并存,且多个项目可以共享缓存的 module
GOPROXY=https://goproxy.cn
在 Go 支持 Go Modules 之后,编译时编译器会从工作目录(当前所在目录)开始并逐级向上查找是否具有 go.mod 文件。
- 如果有,go.mod 文件中声明的 module 名称就视作 go.mod 所在的路径,然后以指定的 main 包为依赖入口,
- 所有以 go.mod 中声明的 module 名称开头的导入路径都以 go.mod 所在的路径为相对路径进行包的查找导入。
- 所有需要导入的路径中如果在 go.mod 中指定了版本,则从
$GOPATH/pkg/mod/
下取得相应版本进行导入, - 如果没有被指定则从
$GOPATH/src/
或$GOROOT/src/
中进行查找导入。 - 如果没有,所有依赖均从
$GOPATH/src/
或$GOROOT/src/
中进行查找导入。
1 |
|
go get github.com/golang/lint/golint
1 |
|
cd 到main.go目录 go build
1 |
|
mod详解
版本号格式
1 |
|