猿问

编译错误只构建一个模块,而不是主包

我正在制作一个 Go 程序并创建了一个模块来划分它。这是我的工作树(minimal目录位于$GOPATH/src/):


  minimal/

  ├── main.go

  └── ui

      ├── go.mod

      ├── go.sum

      └── ui.go

在ui模块中,我有以下内容:


package ui


import "github.com/satori/go.uuid"


func SomeFunction() {

    id, err := uuid.NewV4()

    if err == nil {

        print(id.String())

    } else {

        print(err)

    }

}

包使用这个main模块如下


package main


import "minimal/ui"


func main() {

    ui.SomeFunction()

}

这是go.mod文件:


module minimal/ui


go 1.14


require github.com/satori/go.uuid v1.2.0

在主包文件夹中运行go build时,一切正常并生成二进制文件。但是,仅构建模块时,ui会出现以下编译错误:


ui$ go build

# minimal/ui

./ui.go:6:10: assignment mismatch: 2 variables but uuid.NewV4 returns 1 values

您可以检查https://github.com/satori/go.uuid以查看该函数返回两个值。让我感到困惑的是,构建主包可以工作,但模块却不行。这是为什么?


慕斯709654
浏览 114回答 2
2回答

呼啦一阵风

github.com/satori/go.uuid文档似乎支持GOPATH构建。go module但是,构建会产生不一致的结果。从它的README.md中获取简单的 API 用法:package mainimport "github.com/satori/go.uuid"func main() {    u, err := uuid.NewV4()    _, _ = u, err}并尝试编译它go modules:go mod initgo buildgo: finding module for package github.com/satori/go.uuidgo: found github.com/satori/go.uuid in github.com/satori/go.uuid v1.2.0./main.go:6:9: assignment mismatch: 2 variables but uuid.NewV4 returns 1 values它被标记v1.2.0并且无法编译。所以现在拉出最新的提交:go get github.com/satori/go.uuid@mastergo: github.com/satori/go.uuid master => v1.2.1-0.20181028125025-b2ce2384e17b现在它编译:go build && echo $?0那么这里发生了什么?github.com/satori/go.uuid标记为成熟v1版本,因此所有 dot 版本都应该是没有重大更改的功能增强。最新的标记版本v1.2.0仅从uuid.NewV4().最新提交(go modules推断 . 的伪点发布版本v1.2.1-0.20181028125025-b2ce2384e17b)具有与README.md.如果此 repo 被标记为v1.2.1- 这将是一个重大更改,因为它会更改在先前v1版本中发布的函数的签名。这将违反semver规则。结论:该文档与GOPATH(即非go modules)构建相匹配。GOPATH构建总是拉最新的提交。从一个go modules角度来看,虽然一个人可能能够强制构建一个有效的构建,但它看起来并不被支持。是的,git repo 使用semver标签,但没有go.mod.我不会相信这个包有一个go modules构建。也许考虑使用github.com/google/uuid。

呼如林

该uuid软件包有不同的版本。在最新版本中,函数 NewV4() 仅返回一个变量,但在以前的版本中,它返回两个变量,其中一个是error.您在项目的子目录中创建一个go.mod文件,因此当您在主目录中编译项目时,go-compiler 使用一个版本,而在您的ui目录中它使用另一个版本进行编译。您应该只在文件中编辑uuid包的版本。go.mod
随时随地看视频慕课网APP

相关分类

Go
我要回答