开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

如何在Golang中使用模块

Go模块教程展示了如何在Golang中使用模块。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

模块是存储在文件树中的Go包的集合。

模块包含两个特定的文件:go.modgo.sumgo.mod定义了模块路径和依赖要求.go.sum是一个自动生成的依赖锁文件。

模块使我们能够定义精确的依赖性要求并为多个环境设计可重现的构建。

第三方模块从其存储库下载到模块缓存中。然后在构建应用程序时从这些副本加载这些依赖项。模块缓存默认位于主目录的go子目录中.

go模块命令

go工具提供了几个与模块相关的命令。

  • gomodinit-初始化当前目录中的新模块
  • gomodtidy-添加丢失的模块并删除未使用的模块
  • gomoddownload-将模块下载到本地缓存
  • gomodvendor-制作依赖项的vendored副本
  • gomodgraph-打印模块需求图
  • gomodverify-验证依赖项是否具有预期内容
  • gomodwhy-解释为什么需要包或模块

还有一些与Go模块相关的额外命令。

golist-m列出了可用的模块。goget安装依赖项并更新go.mod文件。gobuildgotest命令根据需要向go.mod添加新的依赖项。

gomod初始化

gomodinit命令创建一个以当前目录为根的新模块。在当前目录中创建一个新的go.mod文件;它必须不存在。

$ go mod init [module-path]

模块路径是用于导入该模块所有包的前缀路径。开发人员经常使用托管源代码的存储库的URL作为模块路径。

$ go mod init com.zetcode/first
go: creating new go.mod: module com.zetcode/first

创建了一个带有com.zetcode/first模块路径的新模块。

$ cat go.mod
module com.zetcode/first

go 1.17

这些是go.mod文件的内容。我们有Go版本的模块路径。

goget命令

依赖项使用goget命令安装。该命令会自动更新go.mod文件并创建go.sum文件。

$ go mod init com.zetcode/myprog

首先,我们创建一个模块。

$ go get gonum.org/v1/gonum/stat
go: downloading gonum.org/v1/gonum v0.9.3
go get: added gonum.org/v1/gonum v0.9.3

我们安装Gonum库。它是一套Go语言的数值库。

$ ls
go.mod  go.sum

我们在当前工作目录中有go.modgo.sum

~/go/pkg/mod/gonum.org/v1/gonum@v0.9.3$ ls -1
appveyor.yml
AUTHORS
blas
cmplxs
CONDUCT.md
CONTRIBUTING.md
CONTRIBUTORS
diff
doc.go
dsp
floats
go.mod
GOPHER
gopher.png
gopher.svg
go.sum
graph
integrate
internal
interp
lapack
LICENSE
mat
mathext
num
optimize
README.md
spatial
stat
THIRD_PARTY_LICENSES
unit
version.go

Gonum库作为模块分发;它默认安装在用户主目录的go子目录中。

package main

import (
    "fmt"
    "math"

    "gonum.org/v1/gonum/stat"
)

func main() {
    xs := []float64{
        12.44, 11.2, 34.5, 1.4, 6.7, 23.4,
    }

    fmt.Printf("data: %v\n", xs)

    mean := stat.Mean(xs, nil)
    variance := stat.Variance(xs, nil)
    stddev := math.Sqrt(variance)

    fmt.Printf("mean: %v\n", mean)
    fmt.Printf("variance: %v\n", variance)
    fmt.Printf("std-dev: %v\n", stddev)
}

我们有一个计算一些基本统计数据的简单示例。

import (
    "fmt"
    "math"

    "gonum.org/v1/gonum/stat"
)

我们得到模块的stat包。

$ go run first.go 
data: [12.44 11.2 34.5 1.4 6.7 23.4]
mean: 14.94
variance: 145.12640000000002
std-dev: 12.046841909811883
$ go list -m all
com.zetcode/myprog
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9
gioui.org v0.0.0-20210308172011-57750fc8a0a6
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af
github.com/boombuler/barcode v1.0.0
github.com/davecgh/go-spew v1.1.0
...

使用golist-mall,我们列出了项目的所有依赖项。

供应商

供应商是满足项目依赖性的一种特定方式。不使用默认模块缓存,而是从vendor子目录下载并加载依赖项。该目录是项目目录的子目录。

$ go mod vendor

gomodvendor命令在主模块的根目录中创建一个名为vendor的目录。该命令还会创建vendor/modules.txt文件,其中包含销售包列表以及从中复制的模块版本。

$ go mod init com.zetcode/second 
$ go get github.com/bykof/gostradamus

我们创建一个项目并下载一个依赖项。gostradamus是一个用于处理日期和时间的库。

package main

import (
     "fmt"

     "github.com/bykof/gostradamus"
)

func main() {

     now := gostradamus.Now()

     fmt.Println(now)
}

该示例打印当前日期时间。

$ go mod vendor

我们初始化vendoring。

$ ls
go.mod  go.sum  second.go  vendor

我们已经创建了vendor目录。

$ ls vendor/github.com/
bykof

它包含我们的依赖。

在本教程中,我们讨论了Go中的模块。

列出所有Go教程。

未经允许不得转载:我爱分享网 » 如何在Golang中使用模块

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏