Go要求可执行程序必须位于package main中,自定义包不可直接运行;其目录名与package声明名须完全一致、导出标识符首字母大写、不得含func main()。

直接运行含自定义包的 Go 文件会报 go run: cannot run non-main package,因为 Go 要求可执行程序必须在 package main 中,而自定义包本身不可执行——它只能被 main 程序导入并调用。
自定义包必须满足三个硬性条件
缺一不可,否则编译或导入会失败:
- 目录名和
package声明名**必须完全一致**,且全小写(如目录utils,文件首行必须是package utils) - 所有导出标识符(函数、变量、结构体字段)**首字母必须大写**(
Add✅,add❌) - 自定义包目录**不能包含
func main()**,否则会被 Go 工具误判为可执行包,导致导入失败
import 路径不是文件路径,而是模块路径
Go 不认 ./utils 或 ../pkg 这类相对路径。import 路径由 go.mod 中的 module 声明决定:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 执行
go mod init example.com/myapp后,myapp/utils/目录对应 import 路径就是example.com/myapp/utils - 即使
main.go和utils/helper.go在同一级目录,也**不能**写import "utils",必须写完整路径 - 想临时用本地路径测试?在
go.mod里加replace:replace example.com/myapp/utils => ./utils
常见错误现象与快速定位
遇到报错时,按顺序检查这几项:
立即学习“go语言免费学习笔记(深入)”;
-
no required module provides package xxx→ 检查go.mod的module名是否和 import 路径前缀一致;当前工作目录是否为模块根目录 -
cannot refer to unexported name xxx→ 查看调用的函数/字段是否首字母小写;确认没跨包访问私有成员 -
undefined: xxx→ 确认 import 别名是否写错(如import u "example.com/myapp/utils",但代码里写了utils.Func()) - IDE 显示 “could not import” → 关闭 GOPATH 模式:
GO111MODULE=on,并确保go.mod存在且路径无拼写错误
最易被忽略的是:包初始化顺序不可控,init() 函数只保证在 main() 前执行,但多个同级包之间没有先后保障。如果一个自定义包依赖另一个包的 init() 初始化全局状态,上线后可能偶发静默失败。

















