你正在使用哪个版本的Go(go version
)?
$ go version
1.20
$ go version -m $(which goimports)
/home/dolmen/go/bin/goimports: go1.20
path golang.org/x/tools/cmd/goimports
mod golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=
dep golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
dep golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
build -buildmode=exe
build -compiler=gc
build CGO_ENABLED=1
build CGO_CFLAGS=
build CGO_CPPFLAGS=
build CGO_CXXFLAGS=
build CGO_LDFLAGS=
build GOARCH=amd64
build GOOS=darwin
build GOAMD64=v3
这个问题在最新版本中是否可以复现?
是的
问题可以在仓库的最新提交中复现:
$ go install golang.org/x/tools/cmd/goimports@master
go: downloading golang.org/x/tools v0.5.1-0.20230207145906-edddc5fc3223
你做了什么?
- 在不包含不完整导入的情况下创建
main.go
。xurls
符号没有链接到任何声明的导入。 - 创建
go.mod
以列出依赖项。有一个模块的主要版本为2:mvdan.cc/xurls/v2@v2.4.0
- 运行
goimports
以修复导入
$ cat main.go
package main
// Some imports are missing.
// I expect goimports to resolve them using modules listed in go.mod.
import "os"
func main() {
os.Args[1] = os.Args[0]
os.Args = os.Args[1:]
//line :1
fmt.Println(xurls.Relaxed().FindAllString(os.Args[1], -1))
}
$ cat go.mod
module demo
go 1.20
require mvdan.cc/xurls/v2 v2.4.0
$ cat go.sum
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
mvdan.cc/xurls/v2 v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc=
mvdan.cc/xurls/v2 v2.4.0/go.mod h1:+GEjq9uNjqs8LQfM9nVnM8rff0OQ5Iash5rzX+N1CSg=
$ go install golang.org/x/tools/cmd/goimports@master
go: downloading golang.org/x/tools v0.5.1-0.20230207145906-edddc5fc3223
$ goimports main.go
package main
// Some imports are missing.
// I expect goimports to resolve them using modules listed in go.mod.
import (
"fmt"
"os"
"mvdan.cc/xurls"
)
func main() {
os.Args[1] = os.Args[0]
os.Args = os.Args[1:]
//line :1
fmt.Println(xurls.Relaxed().FindAllString(os.Args[1], -1))
}
你期望看到什么?
在 main.go
中修复了导入。特别是导入了 mvdan.cc/xurls/v2
。
import (
"fmt"
"os"
"mvdan.cc/xurls/v2"
)
你看到了什么?
我得到了一个导入 mvdan.cc/xurls
(它是v1,并且是不同的API),而不是 mvdan.cc/xurls/v2
。
作为结果,由 goimports 修改的代码无法编译。
4条答案
按热度按时间3zwtqj6y1#
See also #41800 .
svmlkihl2#
我同意#41800是同一个问题。至少在这里,我提供了一个更容易重现的流程。
szqfcxe23#
感谢您提供的简单示例。即使模块缓存和go.mod中都使用了v2版本,imports仍然获取到了错误的版本。
yrefmtwq4#
https://go.dev/cl/582557提到了这个问题:
internal/imports: recognize major versions and use go.mod