Golang模块包远程导入问题的解决方案
Golang模块包远程导入问题的解决方案 问题如下: 我对项目代码进行了重构,将特定功能移至本地包中。 但现在,从该包导入远程GitHub包时遇到了问题。
我的项目结构如下(项目位于磁盘上的“某处”):
login_watch
│ build4linux.cmd
│ Dockerfile
│ go.mod
│ go.sum
│ main.go
│
├───bin
├───log
└───pkg
└───analyzer
series.go
series_test.go
也就是说,我的应用是一个名为“github.com/mustikkakeitto/login_watch”的模块,位于磁盘某处的login_watch文件夹中,并且它有一个main.go文件:
package main
import (
"container/list"
"fmt"
"github.com/mustikkakeitto/login_watch/pkg/analyzer"
"time"
"encoding/json"
"log"
"net/http"
"sync"
"github.com/gorilla/mux"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
)
// 等等
main.go 将本地包导入为“github.com/mustikkakeitto/login_watch/pkg/analyzer”。 该包又导入了来自GitHub的第三方远程包“github.com/texttheater/golang-levenshtein/levenshtein”。 以下是 login_watch/pkg/analyzer/series.go 的内容:
// Package analyzer implements functions to detect series
// built from the particular phone numbers
package analyzer
import (
"container/list"
"fmt"
"time"
"github.com/texttheater/golang-levenshtein/levenshtein"
"log"
)
// 等等
所以现在,当我启动构建/运行命令时,看到以下错误: go run . pkg\analyzer\series.go:10:2: cannot find package
我只是不明白,为什么找不到导入的库包? 当 pkg\analyzer\series.go 中的所有功能都位于 \main.go 中时,它运行得很好……
这是我的 go.mod 文件,位于项目根目录:
module github.com/mustikkakeitto/login_watch
go 1.16
require (
github.com/gorilla/mux v1.8.0
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect
)
另外,记录一些其他信息: go version go1.16.4 windows/amd64 GOPATH=C:\Users\Alex\go 未定义环境变量 GOROOT 未定义环境变量 GO111MODULE
任何帮助都将不胜感激!
更多关于Golang模块包远程导入问题的解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html
哦,哇,这确实是一个非常棘手的Bug!很高兴听到你找到并修复了它。我从未想过会是讨厌的BOM导致了这个问题。
BOM对于UTF-8来说相当无用,但通常是被允许的,并且自Go 1.1起(没写错),Go源文件也允许使用BOM。所以你这边没什么问题。
我在Go仓库的GitHub镜像中找到了一个类似的问题。(原因相同,错误信息不同。)根据那里的评论,运行 go fmt 会自动移除BOM。
更多关于Golang模块包远程导入问题的解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好,@christophberger,感谢你的回复!
长话短说,问题是由我的 pkg/analyzer/series.go 文件中的 UTF-BOM 文件头(EF BB BF)引起的——它似乎以某种方式阻止了编译器解析源文件。
我不太记得我是如何创建这个特定文件的,但与其他所有文件不同,它带有了这个文件头。
我刚刚在一个单独的文件夹中重新实现了你的快速测试,并确保它能工作。
然后,我逐步将原始代码块添加到 series.go 中,并每次都进行测试,最后与原始版本进行了逐字节比较。

天知道,如果没有你的帮助,我要花多长时间才能找出这个该死的问题!
非常感谢!
你好,@mustikkakeitto,欢迎来到这里。
你遇到的错误确实很奇怪。 我快速测试了一下,创建了一个主包和一个分析器包:
main.go:
package main
import (
"fmt"
"github.com/mustikkakeitto/login_watch/pkg/analyzer"
)
func main() {
fmt.Println(analyzer.Dist())
}
以及 pkg/analyzer/series.go:
package analyzer
import "github.com/texttheater/golang-levenshtein/levenshtein"
func Dist() int {
return levenshtein.DistanceForStrings([]rune("a"), []rune("aa"), levenshtein.DefaultOptions)
}
然后我在根目录下运行了:
go mod init github.com/mustikkakeitto/login_watch
go mod tidy
以生成 go.mod 文件:
module
go 1.16
require github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c
并且 go run main.go 返回了 1,没有任何错误。
你可以尝试:
- 运行
go mod tidy - 运行
go mod download github.com/texttheater/golang-levenshtein/levenshtein - 运行
go mod graph并验证输出是否符合预期 - 如果以上方法都不起作用,运行
go clean -modcache(但请注意,这会清除整个模块缓存,后续的编译可能会在缓存重新填满之前花费更长时间)
这是一个典型的Go模块依赖管理问题。问题在于你的go.mod文件中将github.com/texttheater/golang-levenshtein/levenshtein标记为// indirect,但你的代码直接依赖它。
解决方案如下:
- 更新go.mod文件 - 移除
// indirect标记并确保正确导入:
module github.com/mustikkakeitto/login_watch
go 1.16
require (
github.com/gorilla/mux v1.8.0
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/texttheater/golang-levenshtein v1.0.1
)
注意:我移除了/levenshtein后缀,因为该包的模块路径是github.com/texttheater/golang-levenshtein。
- 更新series.go中的导入语句:
package analyzer
import (
"container/list"
"fmt"
"time"
"log"
"github.com/texttheater/golang-levenshtein/levenshtein"
)
- 执行以下命令来同步依赖:
# 清理旧的依赖缓存
go clean -modcache
# 下载所有依赖
go mod download
# 整理go.mod文件
go mod tidy
# 验证构建
go build ./...
- 如果问题仍然存在,尝试完整的模块重置:
# 删除go.sum文件
rm go.sum
# 重新初始化模块依赖
go mod init github.com/mustikkakeitto/login_watch
# 重新下载所有依赖
go mod tidy
# 运行项目
go run main.go
- 检查你的实际使用代码 - 确保你正确使用了该包:
package analyzer
import (
"github.com/texttheater/golang-levenshtein/levenshtein"
)
func CalculateDistance(str1, str2 string) int {
// 正确使用levenshtein包
distance := levenshtein.DistanceForStrings(
[]rune(str1),
[]rune(str2),
levenshtein.DefaultOptions,
)
return distance
}
关键点:
// indirect标记表示该依赖不是直接导入的,但你的代码直接导入了它- Go模块需要明确的直接依赖声明
- 使用
go mod tidy会自动修复依赖关系并移除未使用的依赖
执行这些步骤后,你的项目应该能够正确找到并导入远程GitHub包。

