使用Golang和SQLite构建应用时遇到的代码运行错误

使用Golang和SQLite构建应用时遇到的代码运行错误 大家好, 我编程经验不多,但现在我想学好一门编程语言,最终选择了Go。在阅读了几本书并做了一些简单的代码测试后,我跟着一个更完整的教程,尝试编写第一个完整的程序。不幸的是,我几乎立刻就卡住了,因为运行程序的第一部分就出现了错误,我自己无法解决,所以向你们求助(抱歉英语不好)。这是代码的第一部分:

main.go

package main

import (
        "log"
        "github.com/dixonwille/wmenu/v5"
)

func main() {

        menu := wmenu.NewMenu("What would you like to do?")

        menu.Action(func(opts []wmenu.Opt) error { handleFunc(opts); return nil })

        menu.Option("Add a new Person", 0, true, nil)
        menu.Option("Find a Person", 1, false, nil)
        menu.Option("Update a Person's information", 2, false, nil)
        menu.Option("Delete a person by ID", 3, false, nil)
        menuerr := menu.Run()

        if menuerr != nil {
                log.Fatal(menuerr)
        }
}

错误信息:

go run main.go
main.go:5:2: cannot find package "github.com/dixonwille/wmenu/v5" in any of:
	/home/linuxbrew/.linuxbrew/Cellar/go/1.19.2/libexec/src/github.com/dixonwille/wmenu/v5 (from $GOROOT)
	/home/max/go/src/github.com/dixonwille/wmenu/v5 (from $GOPATH)

我哪里做错了?这个包已经安装了。 你们能帮帮我吗?


更多关于使用Golang和SQLite构建应用时遇到的代码运行错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

你需要导入 “fmt”。

更多关于使用Golang和SQLite构建应用时遇到的代码运行错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,谢谢。

你好 @canuto

你的 go.mod 文件里有什么内容?

执行 go mod tidy 会有帮助吗?

这是完整项目的 go.mod 文件。

module jeremymorgan.com/gosqlite

go 1.17

require (
	github.com/daviddengcn/go-colortext v0.0.0-20180409174941-186a3d44e920 // indirect
	github.com/dixonwille/wlog/v3 v3.0.1 // indirect
	github.com/dixonwille/wmenu/v5 v5.1.0 // indirect
	github.com/mattn/go-isatty v0.0.11 // indirect
	github.com/mattn/go-sqlite3 v1.14.8 // indirect
	golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect
)

我正在学习的项目教程可以在这里找到: allhandsontech.com/programming/golang/how-to-use-sqlite-with-go

感谢您的回答。

canuto:

然后我尝试执行命令“go mod init”,但遇到了这个错误:

go: cannot determine module path for source directory /home/max/go/SqliteTest/Test1-Sqlite (outside GOPATH, module path must be specified)

出现此错误是因为 go mod init 需要模块路径作为参数。

如果你重命名当前的 go.mod 文件并执行

go mod init jeremymorgan.com/gosqlite

你应该会得到一个与你手动创建的类似的 go.mod 文件。

canuto:

go run main.go:

./main.go:30:3: undefined: fmt

正如 @mje 已经写到的,你需要导入 fmt 包,它是标准库的一部分。

提示:一个支持 Go 的编辑器可以利用 Go 语言服务器,根据需要自动添加或移除标准库的导入。(只要编辑器能解析包路径,第三方包也可以。)因此,例如,当你输入 fmt.Println 时,编辑器会自动插入 import "fmt"

感谢分享您的 go.mod 文件。它看起来没问题,只是我原本预期 wmenu 会是一个直接依赖项。

为了测试这个问题,我从您提到的 SQLite 教程中提取了前两个代码片段(这些片段足以让代码编译和运行),将它们放入一个 main.go 文件,并使用 go mod init 创建了一个 go.mod 文件。

然后我运行了 go mod tidy

> go mod tidy                                            0s
go: downloading github.com/dixonwille/wmenu/v5 v5.1.0
go: downloading github.com/dixonwille/wlog/v3 v3.0.1
go: downloading github.com/mattn/go-isatty v0.0.11
go: downloading github.com/daviddengcn/go-colortext v0.0.0-20180409174941-186a3d44e920
go: downloading golang.org/x/sys v0.0.0-20191026070338-33540a1f6037
go: downloading github.com/stretchr/testify v1.4.0
go: downloading github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading gopkg.in/yaml.v2 v2.2.2
go: downloading github.com/davecgh/go-spew v1.1.0

go run main.go 运行正常:

> go run main.go                                        0s
1) *Add a new Person
2) Find a Person
3) Update a Person's information
4) Delete a person by ID
What would you like to do?
1
Adding a new Person

问题:

  1. 您运行 go mod tidy 的输出是什么?
  2. 执行 go clean -modcache && go mod tidy 是否有所改善?
  3. 如果这没有帮助,go build 返回了什么?

首先,你需要初始化 Go 模块并下载依赖包。错误信息表明 Go 编译器无法在 GOROOTGOPATH 中找到 github.com/dixonwille/wmenu/v5 包。这通常是因为没有使用 Go 模块管理依赖,或者依赖包没有正确下载。

解决方案:

  1. 初始化 Go 模块(如果尚未初始化): 在项目根目录下运行以下命令:

    go mod init your-module-name
    

    例如:

    go mod init myapp
    
  2. 下载依赖包: 运行以下命令以下载所有依赖(包括 wmenu/v5):

    go mod tidy
    
  3. 运行程序: 完成上述步骤后,再次运行程序:

    go run main.go
    

完整示例:

假设你的项目结构如下:

myapp/
├── main.go
└── go.mod

go.mod 文件内容(由 go mod initgo mod tidy 自动生成):

module myapp

go 1.19

require github.com/dixonwille/wmenu/v5 v5.1.0

main.go 保持不变。如果 handleFunc 函数未定义,你需要先实现它。例如:

package main

import (
    "log"
    "github.com/dixonwille/wmenu/v5"
)

func handleFunc(opts []wmenu.Opt) {
    // 处理菜单选项的代码
    for _, opt := range opts {
        switch opt.Value {
        case 0:
            log.Println("添加新人员")
        case 1:
            log.Println("查找人员")
        case 2:
            log.Println("更新人员信息")
        case 3:
            log.Println("按ID删除人员")
        }
    }
}

func main() {
    menu := wmenu.NewMenu("What would you like to do?")
    menu.Action(func(opts []wmenu.Opt) error { handleFunc(opts); return nil })
    menu.Option("Add a new Person", 0, true, nil)
    menu.Option("Find a Person", 1, false, nil)
    menu.Option("Update a Person's information", 2, false, nil)
    menu.Option("Delete a person by ID", 3, false, nil)
    menuerr := menu.Run()
    if menuerr != nil {
        log.Fatal(menuerr)
    }
}

运行程序后,菜单将正常显示。如果仍有问题,请检查网络连接或 Go 环境配置。

回到顶部