Go项目必须有go.mod文件,否则无法正确导入依赖、IDE跳转失效;main.go须属package main且func main()无参无返回;变量声明避免混用var与:=;包名目录名须全小写一致。

Go 项目必须有 go.mod 文件,否则不是模块化项目
没有 go.mod 的 Go 项目,go build 可能跑通,但 import 第三方包会失败、IDE 无法跳转、go test 找不到依赖——本质是 Go 已默认启用 module 模式(1.16+),不声明模块就等于没告诉编译器“从哪找依赖”。
实操建议:
- 新建项目第一件事就是执行
go mod init example.com/myapp(域名可自拟,不需真实存在) -
go.mod必须放在项目根目录,不能在子文件夹里;如果已有子目录下误建了go.mod,删掉它 - 若项目根目录存在
go.work,优先删掉——它会覆盖go.mod,导致模块识别失效 - 验证是否生效:在项目根目录运行
go list ./,输出command-line-arguments即表示模块加载成功
main.go 必须在 package main 下,且函数签名严格固定
Go 不允许随意命名入口函数或修改参数签名。func main() 是唯一合法的程序入口,它不能带参数、不能有返回值、必须属于 package main。哪怕只多写一个 int 或少写一对括号,go run 就直接报错。
常见错误现象:
立即学习“go语言免费学习笔记(深入)”;
-
./main.go:5:1: syntax error: non-declaration statement outside function body→ 通常因func main()缺少大括号或花括号错位 -
cannot run program: no 'main' package in ...→ 文件开头没写package main,或写成了package myapp -
go run main.go: main redeclared in this block→ 同一目录下存在多个package main的.go文件(比如main.go和app.go都含func main)
正确结构只有一种:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
变量声明别混用 var 和 :=,尤其在 if/for 作用域内
:= 是短变量声明,只在函数内部可用,且要求左侧至少有一个新变量名;var 是显式声明,可在任何作用域使用。二者语义不同,混用容易触发「变量重复声明」或「未定义引用」。
典型坑点:
- 在
if块中用:=声明变量,该变量出了if就不可见 → 想跨块使用,必须提前用var声明 - 同一行多次
:=,如a, b := 1, 2,若其中a已存在,则仅给a赋值、b才是新声明 → 容易误以为两个都是新变量 - 在循环里反复用
:=声明同名变量,看似每次新建,实际是复用栈空间,但逻辑上仍算“重新声明”,可能掩盖初始化遗漏
建议统一风格:函数顶部用 var 集中声明,业务逻辑中再用 := 赋值,避免歧义。
包名与目录名必须小写且一致,别用下划线或大驼峰
Go 规定包名即目录名,且必须全小写、无空格、无下划线、不许大驼峰(如 my_utils 或 MyHttp 都非法)。否则 go build 不报错,但 import 时路径解析失败,IDE 补全中断,go doc 查不到文档。
例如,目录叫 http_client,里面写了 package http_client,这是错的 —— 正确包名只能是 httpclient。
实操检查项:
- 执行
go list -f '{{.Name}}' ./...,看输出是否全是小写字母组合 - 所有
import语句里的路径最后一段,必须和对应目录名完全一致(区分大小写) - 包内导出标识符(函数、类型、变量)首字母必须大写,否则外部包无法访问 —— 这和包名小写不冲突
最常被忽略的是:包名小写是硬性语法要求,不是风格建议;一旦写错,整个模块对外不可见,且错误提示极其隐晦。


















