包的介绍和定义
包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为辅我们提供了很多内置包,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。
Golang中的包可以分为三种:1. 系统内置包 2. 自定义包 3. 第三方包
系统内置包:Golang语言给我们提供的内置包,引入后可以直接使用,如fmt/strconv/strings/sort/errors/time/encoding/json/os/io等。
自定义包:开发者自己写的包
第三方包:属于自定义包的一种,需要下载安装到本地后才可以使用,如
“github.com/shopspring/decimal”
包解决float精度丢失问题
包管理工具go mod
- 在项目的当前目录里,执行命令:go mod init 项目名 ,会在当前项目目录下自动创建go.mod文件。
- 进入当前项目目录,执行命令:go run main.go,此时会自动下载和关联该项目用到的包。
- 自定义第三方包
进入到go的项目目录下
go mod int demo
- 新建自定义包文件夹calc及calc.go文件
package calc
var aaa = "私有变量"
var Age = 20
//首字母大写,代表公有方法
func Add(x, y int) int {
return x + y
}
func Sub(x, y int) int {
return x - y
}
- 在main.go中导入
package main
import (
"fmt"
"demo/calc"
)
func main() {
sum := calc.Add(10, 2)
fmt.Println(sum) //12
sub := calc.Sub(10, 2)
fmt.Println(sub) //8
}
- 注意事项
- 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下
- 包名可以不和文件夹的名字一样,包名不能包含
-
符号- 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件
- 一个包中的方法要求不能重复
导入包的方式
- 单行导入
import "包1"
import "包2"
- 多行导入
import (
"包1"
"包2"
)
导入时自定义包名
通常用于导入的包名太长或者导入的包名冲突的情况
import 别名 "包的路径"
- 单行引入定义别名
import c "demo/calc"
- 多行引入定义别名
import (
"fmt"
"demo/calc"
T "demo/tools"
)
func main() {
T.PrintInfo();
}
如果只希望导入包,而不使用包内部的数据时,可以使用匿名导入包:在包前面加一个下划线
import _ "demo/calc"
匿名导入的包与其他方式导入的包一样,都会被编译到可执行文件中
init()函数
包中init函数的执行时机: 全局声明 > init() > main()
在运行时,Go编译器构建了一个树状的包引用关系,根据引用顺序决定编译顺序,依次编译这些包的代码,被最后导入的包会最先初始化并调用其init()函数
例:在main中importA, A中importB, B中importC,初始化时执行的顺序为C.init() > B.init() > A.init() > main.init()
有疑问加站长微信联系(非本文作者)