Golang中声明包时遇到错误怎么办

Golang中声明包时遇到错误怎么办 我在 Go 1.17.3 中遇到这个错误:main.go:4:2: 在 /home/developer/go/src/testapp 目录中找到了 routes (routes.go) 和 main (controller.go) 两个包。

我在同一个目录下创建了两个不同的包,就出现了这个错误。但是当我把它们移到不同的文件夹后,代码就能正常运行了。这是 Go 新版本带来的变化吗?因为在我的另一台电脑上它是可以正常工作的。

6 回复

你认为这与 Go 1.17.3 有关吗? 因为在旧版本中它运行正常。

更多关于Golang中声明包时遇到错误怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


但在1.16版本中,我习惯在Internal和cmd目录中声明不同的包。效果非常好。

同一个目录下可以包含多个文件,但这些文件必须使用相同的包名(例如,可以都使用 package routes 或都使用 package main 等,但不能在同一个文件夹中混合使用不同的包名)。

我使用的是 Go 1.16.5,但在此版本中它无法工作。当我尝试将两个属于不同包的文件放在同一个文件夹中并构建时,会出现错误:

$ go build
found packages a (a.go) and b (b.go) in /home/sean/go/src/github.com/skillian/mypkg

有没有一个包含您混合包配置且可以正常工作的代码仓库,我可以尝试克隆并测试一下?

是否有某个参考文档定义了这种行为?

编辑:语言参考规范对此行为的规定并不严格 Go 编程语言规范 - go.dev

这是一个常见的 Go 包管理问题。错误信息表明在同一个目录中发现了两个不同的包声明(routesmain)。根据 Go 语言规范,同一个目录下的所有 Go 文件必须属于同一个包

你的解决方案(将文件移到不同文件夹)是正确的,因为每个文件夹对应一个独立的包。这不是 Go 新版本的变化,而是 Go 语言一直以来的设计原则。另一台电脑能正常工作可能是因为使用了不同版本的 Go 模块管理方式,或者目录结构不同。

以下是正确的目录结构示例:

// 目录结构:
// testapp/
// ├── main.go          (package main)
// ├── controller.go    (package main - 必须与main.go相同包名)
// └── routes/
//     └── routes.go    (package routes)

// main.go 或 controller.go
package main

import (
    "testapp/routes"
)

func main() {
    routes.HandleRoutes()
}

// routes/routes.go
package routes

func HandleRoutes() {
    // 路由处理逻辑
}

如果需要在同一个目录下组织代码,所有文件必须使用相同的包名:

// 所有文件都在 testapp/ 目录下
// main.go
package main

// controller.go  
package main  // 必须是 package main

// routes.go
package main  // 必须是 package main,不能是 package routes

这种设计确保了包的逻辑边界与目录结构的一致性,是 Go 语言模块化设计的重要组成部分。

回到顶部