Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方案。Go语言中为我们提供了很多内置包,如 fmt、os、io 等。任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName 语句,通过该语句声明自己所在的包。
1.1 包的基本概念import "包的路径"注意事项:
import "包 1 的路径" import "包 2 的路径"多行导入
import ( "包 1 的路径" "包 2 的路径" )1.3 包的导入路径
import "lab/test" import "database/sql/driver" import "database/sql"上面代码的含义如下:
test 包是自定义的包,其源码位于GOPATH/lab/test 目录下; driver 包的源码位于GOROOT/src/database/sql/driver 目录下; sql 包的源码位于GOROOT/src/database/sql 目录下。1.4 包的引用格式
import "fmt"此时可以用fmt.作为前缀来使用 fmt 包中的方法,这是常用的一种方式。
package main import "fmt" func main() { fmt.Println("ms的go教程") }自定义别名引用格式
import F "fmt"其中 F 就是 fmt 包的别名,使用时我们可以使用F.来代替标准引用格式的fmt.来作为前缀使用 fmt 包中的方法
package main import F "fmt" func main() { F.Println("ms的go教程") }省略引用格式
import . "fmt"这种格式相当于把 fmt 包直接合并到当前程序中,在使用 fmt 包内的方法是可以不用加前缀fmt.,直接引用。
package main import . "fmt" func main() { //不需要加前缀 fmt. Println("ms的go教程") }匿名引用格式
import _ "fmt"匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。使用标准格式引用包,但是代码中却没有使用包,编译器会报错。如果包中有 init 初始化函数,则通过import _ "包的路径" 这种方式引用包,仅执行包的初始化函数,即使包没有 init 初始化函数,也不会引发编译器报错。
package main import ( _ "database/sql" "fmt" ) func main() { fmt.Println("ms的go教程") }注意:
GO111MODULE=on GOPROXY=https://goproxy.io,direct GOPROXY=https://goproxy.cn,direct(国内的七牛云提供)GO111MODULE 有三个值:off, on和auto(默认值)。
命令 | 说明 |
---|---|
download | download modules to local cache(下载依赖包) |
edit | edit go.mod from tools or scripts(编辑go.mod) |
graph | print module requirement graph (打印模块依赖图) |
init | 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(解释为什么需要依赖) |
1.在 GOPATH 目录下新建一个目录,并使用go mod init初始化生成 go.mod 文件。
go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如go get、go build、go mod等修改和维护 go.mod 文件。go.mod 提供了 module、require、replace 和 exclude 四个命令:
初始化生成的 go.mod 文件如下所示:module hello go 1.13module 语句指定包的名字(路径);
exclude 语句可以忽略依赖项模块。
package main import ( "net/http" "github.com/labstack/echo" ) func main() { // 堆代码 duidaima.com e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323")) }执行go mod tidy运行代码会发现 go mod 会自动查找依赖自动下载
go: finding module for package github.com/labstack/echo go: found github.com/labstack/echo in github.com/labstack/echo v3.3.10+incompatible go: finding module for package github.com/stretchr/testify/assert go: finding module for package github.com/labstack/gommon/log go: finding module for package github.com/labstack/gommon/color go: finding module for package golang.org/x/crypto/acme/autocert go: found github.com/labstack/gommon/color in github.com/labstack/gommon v0.3.1 go: found github.com/labstack/gommon/log in github.com/labstack/gommon v0.3.1 go: found golang.org/x/crypto/acme/autocert in golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce go: found github.com/stretchr/testify/assert in github.com/stretchr/testify v1.7.0go.mod中的内容:
module learning09 go 1.17 require github.com/labstack/echo v3.3.10+incompatible require ( github.com/labstack/gommon v0.3.1 // indirect github.com/mattn/go-colorable v0.1.11 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce // indirect golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect golang.org/x/text v0.3.6 // indirect )go module 安装 package 的原则是先拉取最新的 release tag,若无 tag 则拉取最新的 commit
一般使用包之前,是首先执行go get命令,先下载依赖。比如 github.com/labstack/echo
replace ( golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a )或者
replace golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a备注:go install命令将项目打包安装为可执行文件,在安装在GOPATH的bin目录下,go install执行的项目 必须有main方法