go程序入口必须同时满足package main和func main(),缺一不可;前者需位于文件首行,后者须无参无返回值;单目录仅允许一个main包;go run用于调试,go build生成二进制;fmt.println最适合作为初学者输出函数;新项目需先执行go mod init初始化模块。

main 函数必须在 package main 里
Go 程序入口不是靠文件名或命令行参数决定的,而是靠 package main + func main() 这个组合。漏掉任一,go run 会直接报错:no main module found 或 cannot run non-main package。
常见错误:新建一个 hello.go,写完就跑,但忘了第一行是 package main;或者误写成 package hello —— 这样 Go 就当它是个普通库,不执行。
-
package main必须是文件第一行(可选空白行/注释前) -
func main()必须无参数、无返回值,大小写敏感,不能写成Func Main()或main1() - 一个目录下只能有一个
package main,否则go run *会冲突
用 go run 跑单文件,别急着 go build
新手常卡在“写完代码不知道怎么运行”,本质是混淆了开发调试和打包发布两个阶段。go run 是即时编译+执行,适合改一行试一行;go build 是生成二进制,适合交付。
典型现象:写了 hello.go,执行 go build hello.go 后没报错也没输出,以为失败了——其实它默默生成了一个叫 hello 的可执行文件(Windows 下是 hello.exe),得手动运行。
- 快速验证:直接
go run hello.go,看到输出就说明环境和语法都没问题 - 如果提示
command not found: go,说明没加 Go 安装路径到$PATH,不是代码问题 -
go run不生成中间文件,适合教学和小脚本;go build -o myapp才生成独立二进制
fmt.Println 是最安全的起步输出函数
别一上来就用 fmt.Printf 或 log.Println。前者要记格式动词(%s、%d),后者默认带时间戳和前缀,对第一个程序来说全是干扰。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
真实踩坑:复制网上的例子,把 fmt.Println("Hello, World!") 写成 fmt.Print("Hello, World!"),结果终端没换行、光标卡在句尾,误以为程序卡死。
-
fmt.Println自动换行,适合绝大多数初学场景 - 如果用
fmt.Print,记得结尾加\n,比如fmt.Print("Hello, World!\n") -
log包需要导入"log",而fmt是标准库,无需额外配置
模块初始化容易被跳过
Go 1.11+ 默认启用 module 模式,但新项目如果不初始化,go run 可能报 go: cannot find main module,尤其当你不在 $GOPATH 下操作时。
这不是语法错误,而是 Go 在找“当前项目属于哪个模块”。它会向上遍历目录找 go.mod,找不到就拒绝运行——哪怕你只跑一个文件。
- 解决方法很简单:在项目根目录执行
go mod init example.com/hello(模块名可以任意,只要符合域名格式) - 执行后生成
go.mod文件,内容只有两行:module example.com/hello和go 1.xx - 后续加依赖(比如用
http包)时,go run会自动更新go.mod,不用手写
模块名本身不影响运行,但它决定了 import 路径和依赖解析逻辑。很多人写完 go mod init 就以为万事大吉,其实只是让 Go “认出”这个目录是个项目而已。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










