Golang中如何解决import cycle not allowed的问题

Golang中如何解决import cycle not allowed的问题 我知道这可能是一个常见问题,但经过大约一小时的搜索,我仍然没能解决它……

我通过以下命令生成了一个 go.mod 文件:

go mod init github.com/go-sql-driver/mysql
module github.com/go-sql-driver/mysql

go 1.16

还有一个 main.go 文件:

package main

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {

}

当我运行 go run main.go 时,得到以下错误:

package command-line-arguments
	imports github.com/go-sql-driver/mysql
	imports github.com/go-sql-driver/mysql: import cycle not allowed

更多关于Golang中如何解决import cycle not allowed的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

这就是问题所在!我误解了 mod init 的作用。感谢您的帮助!!

更多关于Golang中如何解决import cycle not allowed的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,@jvannier,欢迎来到论坛。

我怀疑问题在于你在这里将模块命名为了“GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go’s (golang) database/sql package”:

jvannier 说:

go mod init github.com/go-sql-driver/mysql

但是,你在该命令中指定的模块名本应是你自己代码的模块名。当你在下面这里导入“GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go’s (golang) database/sql package”时:

jvannier 说:

    _ "github.com/go-sql-driver/mysql"

你通过告诉 Go 编译器你自己的包叫“GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go’s (golang) database/sql package”,然后又导入了一个具有相同包标识符的模块,从而“搞混”了 Go 编译器。

这是一个典型的模块命名冲突问题。你的 go.mod 文件将模块声明为 github.com/go-sql-driver/mysql,这与你要导入的第三方包完全相同,导致Go认为你在尝试导入自己。

解决方案:

  1. 修改 go.mod 文件,使用你自己的模块名(不要与第三方包同名):
module myapp

go 1.16

或者使用你自己的仓库路径:

module github.com/yourusername/myapp

go 1.16
  1. 更新后的完整示例:

go.mod:

module myapp

go 1.16

require github.com/go-sql-driver/mysql v1.6.0

main.go:

package main

import (
	"database/sql"
	"log"
	
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	db, err := sql.Open("mysql", "user:password@/dbname")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	
	// 使用数据库连接
}
  1. 运行前执行依赖同步:
go mod tidy
go run main.go

关键点: 模块名必须是唯一的,不能与你要导入的第三方包同名。Go模块系统通过模块名来区分不同的包,同名会导致循环导入的假象。

回到顶部