Golang模块与包的使用指南

Golang模块与包的使用指南 我正在将我的代码库转换为使用模块,但在仓库内的包中导入已下载的模块时遇到了问题。我的仓库链接如下。每当我尝试任何 go get 命令时,它似乎都找不到 excelize 库,即使它已经包含在 go.mod 文件中。我花了大约两个小时研究这个问题,但一直无法解决。我是模块的新手,所以可能遗漏了一些东西。

GitHub

bconn98/DrugRecord

头像

在 GitHub 上创建一个账户,为 bconn98/DrugRecord 的开发做出贡献。

谢谢!


更多关于Golang模块与包的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

请粘贴一下 go.mod 的内容好吗?

更多关于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,存在一些问题:

  1. 根仓库中缺少 go.mod 文件。根据 Github 工单的指导,此问题已修复。
  2. 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 规则是什么,以及迁移技术。

看起来excelize包存在一个问题。我尝试通过将所有嵌套包移动到根目录,在我的本地机器上使用你本地的模块。

我查看了GitHub - qax-os/excelize: Go语言读写Microsoft Excel™(XLAM / XLSM / XLSX / XLTM / XLTX)电子表格的库仓库。它的README文件说明,如果我们使用go module,需要使用以下命令:

go get github.com/360EntSecGroup-Skylar/excelize/v2

当我运行这个命令时,go.mod文件同时包含了版本1和版本2。

module github.com/bconn98/DrugRecord

go 1.14

require (
github.com/360EntSecGroup-Skylar/excelize v1.4.1
github.com/360EntSecGroup-Skylar/excelize/v2 v2.2.0 // indirect
github.com/gorilla/mux v1.7.4
github.com/gotk3/gotk3 v0.4.0 // indirect
github.com/lib/pq v1.6.0
github.com/sqweek/dialog v0.0.0-20200601143742-43ea34326190
github.com/xuri/efp v0.0.0-20200605144744-ba689101faaf // indirect
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
)

我遇到了和你一样的编译错误。

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 库的实例,该库已被导入并且似乎被模块识别为依赖项。

根据你的仓库结构,问题在于你的模块声明和导入路径不匹配。以下是具体问题和解决方案:

问题分析

  1. 模块路径问题:你的 go.mod 文件声明模块为 DrugRecord,但实际导入时使用的是相对路径
  2. 包导入方式错误:在模块中不能使用相对路径导入其他包

解决方案

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
    // 其他依赖...
)

// 间接依赖会自动管理

关键点说明

  1. 模块导入:在 Go 模块中,所有内部包的导入都必须基于模块路径
  2. excelize 依赖:确保 go.mod 中正确声明了 excelize 版本
  3. 模块缓存:有时需要清理 Go 模块缓存

执行这些步骤后,go get 命令应该能正常工作,excelize 库也能被正确导入。

回到顶部