Golang 中包的介绍和定义
-
包(package)是多个 Go 源码的集合,是一种高级的代码复用方案
-
Go 语言为我们提供了很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。
-
Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包
- 系统内置包
- fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等
- 2、自定义包
- 开发者自己写的包
- 3、第三方包
- 属于自定义包的一种,需要下载安装到本地后才可以使用
- 如前面给大家介绍的"
github.com/shopspring/decimal
"包解决 float 精度丢失问题
- 系统内置包
Golang包管理工具go mod
- 在 Golang1.11 版本之前如果我们要自定义包的话必须把项目放在 GOPATH 目录。
- Go1.11 版本之后无需手动配置环境变量,使用 go mod 管理项目
- 也不需要非得把项目放到 GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目
- Go1.13 以后可以彻底不要 GOPATH了。
go mod init
初始化项目
-
实际项目开发中我们首先要在我们项目目录中用 go mod 命令生成一个 go.mod 文件管理我们项目的依赖。
-
比如我们的 golang 项目文件要放在了 itying 这个文件夹,这个时候我们需要在 itying 文件夹
-
里面使用 go mod 命令生成一个 go.mod 文件
-
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。
-
go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
-
go.mod 提供了module, require、replace和exclude 四个命令
- module 语句指定包的名字(路径)
- require 语句指定的依赖项模块
- replace 语句可以替换依赖项模块
- exclude 语句可以忽略依赖项模块
go mod常用命令
命令 | 说明 |
---|---|
download |
download modules to local cache(下载依赖包) |
edit |
edit go.mod from tools or scripts(编辑go.mod) |
graph |
print module requirement graph (打印模块依赖图) |
verify |
initialize new module in current directory(在当前目录初始化mod) |
tidy |
add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
vendor |
make vendored copy of dependencies(将依赖复制到vendor下) |
verify |
verify dependencies have expected content (验证依赖是否正确) |
why |
explain why packages or modules are needed(解释为什么需要依赖) |
Golang 中自定义包
- 包(package)是多个 Go 源码的集合,一个包可以简单理解为一个存放多个
.go
文件的文件夹。 - 该文件夹下面的所有 go 文件都要在代码的第一行添加如下代码,声明该文件归属的包。
package 包名
初始化项目
mkdir Demo
cd Demo
go mod init Demo
Demo/calc/calc.go
- 如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。
- 在 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
}
Demo/main.go
package main
import (
c "Demo/calc" // c是取的别名
"fmt"
)
func main() {
sum := c.Add(10, 2)
fmt.Println(sum) //12
sub := c.Sub(10, 2)
fmt.Println(sub) // 8
}
func init() { //main包中init函数 优先于 main函数
fmt.Println("main init...")
}
/*
main init...
12
8
*/
init()
初始化函数
init()
函数介绍
- 在Go语言程序执行时导入包语句会自动触发包内部
init()
函数的调用。 - 需要注意的是:
init()
函数没有参数也没有返回值。 init()
函数在程序运行时自动被调用执行,不能在代码中主动调用它。
init()
函数执行顺序
-
Go 语言包会从 main 包开始检查其导入的所有包,每个包中又可能导入了其他的包。
-
Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。
-
在运行时,被最后导入的包会最先初始化并调用其 init()函数, 如下图示
Golang中使用第三方包
查找golang的第三方包
我们可以在 https://pkg.go.dev/
查找看常见的 golang 第三方包
安装这个包
第一种方法:go get 包名称
(全局)
go get github.com/shopspring/decimal
第二种方法:go mod download
(全局)
依赖包会自动下载到$GOPATH/pkg/mod
,多个项目可以共享缓存的 mod
注意使用 go mod download
的时候首先需要在你的项目里面引入第三方包
go mod download
第三种方法:go mod vendor
将依赖复制到当前项目的 vendor 下 (本项目)
将依赖复制到当前项目的 vendor
下
注意:使用 go mod vendor
的时候首先需要在你的项目里面引入第三方包
go mod vendor
看文档使用这个包
包安装完毕后我们就可以看文档使用这个包了…