Golang模块与包的使用指南
Golang模块与包的使用指南
我正在将我的代码库转换为使用模块,但在仓库内的包中导入已下载的模块时遇到了问题。我的仓库链接如下。每当我尝试任何 go get 命令时,它似乎都找不到 excelize 库,即使它已经包含在 go.mod 文件中。我花了大约两个小时研究这个问题,但一直无法解决。我是模块的新手,所以可能遗漏了一些东西。
bconn98/DrugRecord
在 GitHub 上创建一个账户,为 bconn98/DrugRecord 的开发做出贡献。
谢谢!
更多关于Golang模块与包的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
go.mod 文件在仓库根目录创建时,其旁边必须有相关联的 Go 源代码。我找到的唯一 Go 源代码位于 DrugRecord/DrugRecord 目录内。你可能需要将其移到根目录级别(即 DrugRecord 目录下),然后重新初始化 go.mod。
这样就可以解决问题了。
module github.com/bconn98/DrugRecord
go 1.14
require (
github.com/360EntSecGroup-Skylar/excelize v1.4.1
github.com/gorilla/mux v1.7.4
github.com/lib/pq v1.6.0
github.com/sqweek/dialog v0.0.0-20200601143742-43ea34326190
)
注意:链接已再次编辑。
根据 https://github.com/bconn98/DrugRecord/issues/1,存在一些问题:
- 根仓库中缺少
go.mod文件。根据 Github 工单的指导,此问题已修复。 https://github.com/bconn98/DrugRecord/blob/modules/mainUtils/excelWriter.go文件仍在导入版本 1.4.1,而非期望的v2版本。正如预期的那样,这导致了许多函数缺失的错误。修复了import语句和require子句后,库代码现在可以正常工作了。
你可以阅读 https://blog.golang.org/using-go-modules 来进一步了解。这对于未来的开发来说是值得花时间的。
它将解释为什么 go.mod 对依赖版本管理如此严格,v2 规则是什么,以及迁移技术。
go.mod 文件现在位于根目录(我删除了它并重新执行了“go mod init …”命令),并且我也将其余代码移动到了该层级,因为之前的嵌套结构是我一直懒得修复的错误。然而,尝试运行后我仍然得到以下输出。
注意:我编辑了链接,在点号和 com 之间添加了空格,这样它们就不会被识别为链接。除此之外,此输出是直接复制粘贴的。
go: finding module for package github. com/gorilla/mux
go: finding module for package github. com/360EntSecGroup-Skylar/excelize
go: finding module for package github. com/lib/pq
go: finding module for package github. com/sqweek/dialog
go: found github. com/gorilla/mux in github. com/gorilla/mux v1.7.4
go: found github. com/360EntSecGroup-Skylar/excelize in github. com/360EntSecGroup-Skylar/excelize v1.4.1
go: found github. com/lib/pq in github. com/lib/pq v1.6.0
go: found github. com/sqweek/dialog in github. com/sqweek/dialog v0.0.0-20200601143742-43ea34326190
# github. com/bconn98/DrugRecord/mainUtils
mainUtils\excelWriter.go:30:22: file.MergeCell(acName, "A7", "C7") used as value
mainUtils\excelWriter.go:31:22: file.MergeCell(acName, "D7", "F7") used as value
mainUtils\excelWriter.go:32:22: file.MergeCell(acName, "A9", "F9") used as value
mainUtils\excelWriter.go:37:29: file.SetCellFormula(acName, "G" + strconv.Itoa(i), "=G" + strconv.Itoa(i - 1) + " + C" + strconv.Itoa(i) + "- F" + strconv.Itoa(i)) used as value
mainUtils\excelWriter.go:45:33: undefined: excelize.StreamWriter
mainUtils\excelWriter.go:48:22: undefined: excelize.Cell
mainUtils\excelWriter.go:51:3: undefined: excelize.Cell
mainUtils\excelWriter.go:203:33: undefined: excelize.StreamWriter
mainUtils\excelWriter.go:231:35: undefined: excelize.StreamWriter
mainUtils\excelWriter.go:255:33: undefined: excelize.StreamWriter
mainUtils\excelWriter.go:51:3: too many errors
我预料到 # 符号之前的一切,但之后的所有内容都是使用 excelize 库的实例,该库已被导入并且似乎被模块识别为依赖项。
根据你的仓库结构,问题在于你的模块声明和导入路径不匹配。以下是具体问题和解决方案:
问题分析
- 模块路径问题:你的
go.mod文件声明模块为DrugRecord,但实际导入时使用的是相对路径 - 包导入方式错误:在模块中不能使用相对路径导入其他包
解决方案
1. 修正模块声明
首先,更新你的 go.mod 文件,使用完整的模块路径:
# 在项目根目录执行
go mod init github.com/bconn98/DrugRecord
2. 修正导入语句
在 cmd/main.go 中,修改导入语句:
package main
import (
"fmt"
"log"
// 使用完整的模块路径导入
"github.com/bconn98/DrugRecord/internal/database"
"github.com/bconn98/DrugRecord/internal/excel"
// 外部依赖
"github.com/xuri/excelize/v2"
)
func main() {
// 现在可以正常使用这些包
db := database.New()
excelProcessor := excel.NewProcessor()
f := excelize.NewFile()
// ... 其他代码
}
3. 在 internal/excel/excel.go 中同样修正导入:
package excel
import (
"github.com/bconn98/DrugRecord/internal/database"
"github.com/xuri/excelize/v2"
)
type Processor struct {
db *database.DB
}
func NewProcessor() *Processor {
return &Processor{
db: database.New(),
}
}
func (p *Processor) Process() error {
f := excelize.NewFile()
// 使用 excelize 库
f.NewSheet("Sheet1")
return f.SaveAs("test.xlsx")
}
4. 清理并重新构建
# 清理旧的构建缓存
go clean -modcache
# 下载所有依赖
go mod download
# 整理 go.mod 文件
go mod tidy
# 构建项目
go build ./cmd
5. 如果问题仍然存在,检查 go.mod 文件:
确保 go.mod 包含正确的依赖:
module github.com/bconn98/DrugRecord
go 1.21
require (
github.com/xuri/excelize/v2 v2.8.0
// 其他依赖...
)
// 间接依赖会自动管理
关键点说明
- 模块导入:在 Go 模块中,所有内部包的导入都必须基于模块路径
- excelize 依赖:确保
go.mod中正确声明了 excelize 版本 - 模块缓存:有时需要清理 Go 模块缓存
执行这些步骤后,go get 命令应该能正常工作,excelize 库也能被正确导入。


