
Go 允许将多个 .go 文件置于同一目录下并同属 package main,此时无需 import 语句即可互相调用;这是语言规范支持的标准做法,无需 src/ 目录或独立包路径。
go 允许将多个 `.go` 文件置于同一目录下并同属 `package main`,此时无需 `import` 语句即可互相调用;这是语言规范支持的标准做法,无需 `src/` 目录或独立包路径。
在 Go 中,包(package)是编译的基本单位,而非文件或目录。只要多个 .go 文件位于同一目录下,且都声明为相同的包名(如 package main),Go 编译器就会自动将它们视为同一个包的组成部分——无需 import,也不需要任何路径声明。
✅ 正确示例(推荐的扁平化结构):
./ ├── main.go └── lib.go
main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello from main!")
sayHello() // 直接调用 lib.go 中定义的函数
}lib.go:
package main // 必须与 main.go 同包名
func sayHello() {
print("Hello from lib.go!\n")
}运行方式:
go run main.go lib.go # 显式列出所有文件(推荐用于单目录多文件) # 或 go run *.go # 等效(shell 展开后效果相同)
⚠️ 注意事项:
- 所有同目录
.go文件必须声明完全相同的package名称(如package main),否则编译报错:package main redeclared in this block或cannot load ...: package ... is not in GOROOT; - 不可对
package main内的其他文件使用import "./lib"或import "lib"—— 这是非法语法,Go 不支持相对路径导入或本地包名导入(除非启用 Go Modules 且该目录是模块根,但此时仍需package lib+import "./lib",与本场景目标相悖); - 若未来需复用
lib.go中的逻辑到其他项目,建议将其重构为独立包(如package utils),放入子目录(如./utils/utils.go),再通过import "your-module/utils"使用——但这属于模块化演进,不否定当前扁平结构的合法性与实用性。
? 总结:Go 的设计哲学强调“约定优于配置”。同一目录 + 同一包名 = 天然共享作用域。抛弃 src/ 目录、摒弃强制分包,是 Go 原生支持且广泛采用的简洁实践——从 CLI 工具到小型服务,大量真实项目均采用 main.go + handler.go + db.go 等同级文件组织方式。只需牢记:包名一致,即为一体;无需 import,自然可见。

















