常见错误排查

这一节整理初学 Go 时常见的问题。

一、找不到 go.mod

错误类似:

go: cannot find main module

原因:当前目录不是 Go Modules 项目。

解决:

go mod init example.com/demo

然后再运行:

go run .

二、导入了包但没使用

错误:

imported and not used

Go 不允许导入没使用的包。

删除没用的 import,或使用它。

格式化和整理:

gofmt -w .
go mod tidy

三、变量声明但没使用

错误:

declared and not used

Go 不允许局部变量声明后不用。

错误示例:

name := "张三"

如果暂时不用,可以删除。

不要为了绕过错误随便写 _ = name,除非你明确知道为什么要保留。

四、大小写导致访问不到

type user struct {
	name string
}

小写只能当前包访问,也不能被 encoding/json 当作导出字段处理。

如果要跨包访问或 JSON 编码:

type User struct {
	Name string `json:"name"`
}

五、nil 指针 panic

错误:

panic: runtime error: invalid memory address or nil pointer dereference

原因:访问了 nil 指针。

var user *User
fmt.Println(user.Name)

修复:

if user != nil {
	fmt.Println(user.Name)
}

更重要的是检查为什么 user 会是 nil。

六、map 没初始化就写入

错误:

panic: assignment to entry in nil map

错误示例:

var m map[string]int
m["age"] = 18

正确:

m := make(map[string]int)
m["age"] = 18

七、端口被占用

错误:

bind: address already in use

说明端口已经被其他程序占用。

解决:

  • 换一个端口。
  • 停掉占用端口的旧进程。

八、依赖下载慢

可以设置代理:

go env -w GOPROXY=https://goproxy.cn,direct

然后:

go mod tidy

九、排查习惯

建议按顺序看:

  1. 错误第一行。
  2. 文件名和行号。
  3. 最近改过的代码。
  4. 是否忘记初始化。
  5. 是否 nil。
  6. 是否包名、导出名、模块名写错。

Go 的报错通常比较直接,认真读错误信息比盲目搜索更有效。