Go程序入口必须同时满足package main和func main(),缺一不可;fmt.Println是安全的入门输出方式;go run需go.mod或GOPATH上下文;Windows中文乱码多因终端编码非UTF-8。

main函数必须在package main里
Go 程序入口不是靠文件名或命令行参数决定的,而是由 package main 和 func main() 共同锁定。漏掉任一,go run 会直接报错:no main module found 或 cannot run non-main package。
常见错误现象:
- 新建
hello.go但开头写成package hello—— 不行 - 写了
func main(),但包声明是package utils—— 也不行 - 用
go run *.go时混入了非 main 包文件,导致编译器找不到唯一入口 —— 报错模糊,容易卡住
实操建议:
- 所有可执行程序,第一行必须是
package main -
func main()必须小写main,且不能带参数、不能有返回值(Go 语言强制) - 如果项目有多个
.go文件,确保只有一个是package main,其余要么是package main(同一包内合法),要么是其他包名(但不会参与构建可执行文件)
fmt.Println 是最安全的入门输出方式
新手常想用 print 或 printf,但 Go 没有全局 print 函数,fmt.Printf 又要求格式字符串匹配,容易因少一个 %s 或类型不对而 panic。而 fmt.Println 自动加换行、自动处理类型、不校验占位符,容错率高。
立即学习“go语言免费学习笔记(深入)”;
使用场景:
- 调试变量值(
fmt.Println("name:", name)) - 快速验证程序是否跑通(比如只输出
"Hello World") - 不需要格式控制、不追求性能的脚本式输出
注意点:
-
fmt.Print不换行,容易让终端输出粘连,初学者难察觉 -
fmt.Printf在格式字符串缺失或类型不匹配时,运行时报错:panic: runtime error: invalid memory address或更隐蔽的fatal error: unexpected signal - 别导入
fmt却不用 —— Go 编译会直接拒绝:imported and not used: "fmt"
go run hello.go 要求当前目录有 go.mod 或在 GOPATH/src 下
Go 1.16+ 默认启用模块模式,go run 期望项目根目录下有 go.mod 文件。没有的话,可能报:go: cannot find main module。这不是语法错误,而是模块系统找不到上下文。
实操建议:
- 最简单做法:在空目录下先执行
go mod init hello,再写hello.go,然后go run hello.go - 不想初始化模块?可以用
go run -gcflags="all=-l" hello.go绕过,但不推荐 —— 这只是临时跳过检查,实际开发中模块是必需的 - 老式 GOPATH 方式已逐步淘汰;若还依赖它,需确保文件路径为
$GOPATH/src/hello/hello.go,且cd $GOPATH/src/hello后再go run hello.go
兼容性影响:
- 没
go.mod时,go run可能降级到 GOPATH 模式,行为不一致,CI/CD 中容易出问题 - 不同 Go 版本对模块默认行为略有差异(如 1.12–1.15 需显式
GO111MODULE=on),统一用go mod init最省心
Windows 下中文输出乱码不是 Go 的锅
在 Windows CMD 或 PowerShell 里跑 fmt.Println("你好") 显示问号或方块,大概率是终端编码问题,不是 Go 编译或运行时的问题。Go 字符串原生支持 UTF-8,源文件保存为 UTF-8(无 BOM)即可。
排查步骤:
- 确认
hello.go是 UTF-8 编码(VS Code 默认是,记事本要选“UTF-8”另存,别选“ANSI”) - CMD 中执行
chcp 65001切换到 UTF-8 代码页(PowerShell 默认支持更好,但旧版也要手动设) - 某些终端(如老旧 ConEmu、部分 IDE 内置终端)默认不启用 UTF-8,需单独配置
绕不过去的情况:
- 用
os.Stdout.Write([]byte("你好"))替代fmt.Println—— 更底层,但也更易出错(比如没换行、没 flush) - 生产环境避免依赖终端编码,日志写文件或传 HTTP 更可靠
真正该警惕的是:把编码问题误判为 Go 不支持中文,继而改用拼音或英文硬编码,反而埋下本地化隐患


















