
Go 允许将多个 .go 文件置于同一目录下并同属一个包(如 package main),无需目录结构或 import 语句即可相互调用,这是语言原生支持的标准做法。
go 允许将多个 `.go` 文件置于同一目录下并同属一个包(如 `package main`),无需目录结构或 `import` 语句即可相互调用,这是语言原生支持的标准做法。
在 Go 中,包(package)的边界由目录定义,而非文件名或 import 路径;但同一目录下的所有 .go 文件必须声明相同的 package 名称,才能被编译器视为同一个逻辑单元。这意味着,你完全可以用如下简洁布局替代传统的 src/lib/ 结构:
. ├── main.go └── lib.go
只要两个文件均以 package main 开头,Go 编译器就会自动将它们合并为一个包,无需任何 import 声明:
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello from main!")
SayHello() // 直接调用 lib.go 中定义的函数
}// lib.go
package main
import "fmt"
func SayHello() {
fmt.Println("Hello from lib.go!")
}✅ 编译运行:
go run main.go lib.go # 或更简洁地(Go 1.20+ 自动识别同目录文件): go run .
⚠️ 注意事项:
- 所有同目录
.go文件必须使用相同的package名称(如main、utils等),否则编译报错:package xxx; expected yyy。 - 若希望
lib.go被其他包复用(如作为独立库),则必须将其移入独立子目录(如./lib/),并声明package lib,再通过import "./lib"(本地路径)或模块路径(如example.com/myapp/lib)导入——但这属于可导出包的设计场景,与当前“同目录协作”需求不同。 -
package main仅用于可执行程序;若构建库包,请统一使用非main的包名(如package utils),并确保整个目录只含该包文件。
总结:Go 的设计哲学强调“约定优于配置”——同一目录即同一包,无需 import、无需 src 嵌套、无需额外配置。合理利用这一机制,可显著简化小型工具、脚本及原型开发的项目结构。

















