包的介绍和定义
- 包(packge)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了 很多内置包,如:fmt、strconv、strings、sort、eros、time、encoding/json、os、io 等
- Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包 系统内置包: Golang
语言给我们提供的内置包,引入后可以直接使用,如 fmt、srconv、strings、sort、eros、time、encoding/json、os、io 等 - 自定义包:开发者自己写的包
包管理工具 go mod
在 Golang1.11版本之前如果我们要自定义包的话必须把项目放在 GOPATH 目录。Go1.11版本之后无需手动配置环境变量,使用 go mod 管理项目,也不需要非得把项目放到 GOPATH
指定目录下,你可以在你磁盘的任何位置新建一个项目 , Go1.13以后可以彻底不要 GOPATH了。
go mod init 初始化项目
demo为项目文件夹,生成go.mod文件如下:
go mod 命令
命令名 | 作用 |
---|---|
download | download modules to local cache (下载依赖的 module 到本地 cache) |
edit | edit go.mod from tools or scripts (编辑 go.mod 文件) |
graph | print module rquirement graph (打印模块依赖图) |
init | intalize new module in curent directory (再当前文件夹下初始化一个新的module, 创建 go.mod 文件) |
tidy | add missing and remove unused modules (增加丢失的 module,去掉未用的module) |
vendor | make vendored copy of dependencies (将依赖复制到 vendor 下) |
verify | verify dependencies have expectd content (校验依赖 检查下载的第三方库有没有本地修改,如果有修改,则会返回非 0,否则验证成功。) |
why | explain why packges or modules are needed (解释为什么需要依赖) |
自定义包 packge 包名
包(packge)是多个 Go 源码的集合,一个包可以简单理解为一个存放多个.go 文件的文件
夹。该文件夹下面的所有 go 文件都要在代码的第一行添加如下代码,声明该文件归属的包
packge 包名
- 一个文件夹下面直接包含的文件只能归属一个 packge,同样一个 packge 的文件不能在多个文件夹下
- 包名可以不和文件夹的名字一样,包名不能包含 - 符号
- 包名为 main 的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含 main 包的源代码则不会得到可执行文件
定义一个calc包
如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识
符必须是对外可见的(public)。在 Go 语言中只需要将标识符的首字母大写就可以让标识
符对外可见了
package calc //必须放在文件首位
var Age = 20 //公有变量
var age = 10 //私有变量
func Add(x, y int) int { //首字母大写是公有方法
return x + y
}
func Sub(x, y int) int {
return x - y
}
func add(x, y int) int { //首字母小写是私有方法,只能自己包内访问
return x + y
}
定义一个tools包
package calc
import "fmt"
func Mul(x,y int) int {
return x*y
}
func PrintInfo() {
fmt.Println("你调用tools包方法")
}
目录结构
main.go 中引入包
package main
import (
"fmt"
"demo/calc"
)
func main() {
sum :=calc.Add(1,2)//3
mul :=calc.Mul(5,4)//20
fmt.Println(sum)
fmt.Println(mul)
calc.PrintInfo()//你调用tools包方法
}
导入包 import
import "fmt"
import (
"fmt"
"demo/calc"
)
匿名导入包
import _ “包的路径”
匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中
自定义包的别名
import "fmt"
import t "demo/calc" //给包起了个别名 t 一般比较长的包名用别名
sum :=t.Add(1,2) // 3
fmt.Println(sum)
t.PrintInfo() //你调用tools包方法
Golang 中 int()初始化函数
- 在Golang 程序执行时导入包语句会自动触发包内部 init()函数的调用
- init()函数没有参数也没有返回值
- init()函数在程序运行时自动被调用执行,不能在代码中主动调用它
包初始化执行的顺序:
全局声明=====>init()======>main()
package main
import "fmt"
var x int = 10
func init() {
fmt.Println(x)
}
func main() {
fmt.Print("hello world")
}
//输出 10 hello world
init()函数执行顺序
- Go 语言包会从 main 包开始检查其导入的所有包,每个包中又可能导入了其他的包
- Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码
- 在运行时,被最后导入的包会最先初始化并调用其 init()函数