不是代码写错了,而是命令用错了:go run main.go只编译该文件,不包含同目录其他package main文件;应改用go run .编译整个包。

go run main.go 报 undefined 不是代码错,是命令用错了
你写好了 main.go,又加了 config.go 和 db.go,都在同一目录、同为 package main,但执行 go run main.go 就报 undefined: loadConfig 或 undefined: AppConfig——这不是语法错误,也不是 import 写漏了,而是 Go 构建模型的明确行为:它只编译你**显式列出的文件**。
Go 的编译单位是“包”,不是“文件”。go run main.go 会把 main.go 单独拎出来,构建一个临时包(名字叫 # command-line-arguments),完全不看同目录下的其他 .go 文件。
-
go run main.go→ 只编译main.go这一个文件 -
go run .→ 编译当前目录下所有package main的.go文件 - 多文件时硬写
go run main.go config.go db.go router.go也能跑,但极易漏、难维护
import 路径写错:http、path、filepath 都不是顶层包名
看到 undefined: http.Get 或 undefined: filepath.Walk,第一反应不该是“函数不存在”,而是检查 import 是否用了**完整路径**。Go 标准库没有 http、path、filepath 这些独立包,它们都嵌套在更长的路径里。
-
http.Get必须配import "net/http",写"http"或"net"都会报错 -
path.IsAbs对应import "path";filepath.Walk对应import "path/filepath",二者不能混用 -
io.Pipe实际来自import "io/pipe"(注意斜杠),不是"io"本身提供的 - 第三方包如
gin必须写全路径:import "github.com/gin-gonic/gin",只写"gin"无效
自定义包被当成 test 包:_test.go 后缀会破坏导入
如果你的自定义包文件名以 _test.go 结尾(比如 client_test.go),Go 编译器会把它识别为测试专用文件,即使它定义的是普通 package client_test,主程序也无法 import 它——此时报错是 undefined: client_test,同时伴随 imported and not used。
- 只要文件名含
_test.go,无论内容如何,都属于测试上下文 - 解决方法只有重命名:把
client_test.go改成client.go,包声明同步改为package client - 测试文件应单独放在
xxx_test.go中,且只调用被测包的公开接口,不参与主程序构建
database/sql.Open 报 undefined?缺驱动比缺 sql 包更常见
undefined: database/sql.Open 看似是没 import database/sql,但实际更多时候是因为——你 import 了 database/sql,却**忘了导入数据库驱动**,而 Go 要求驱动必须显式导入(哪怕不直接调用)。
- 必须同时有这两行:
import "database/sql"和import _ "github.com/lib/pq"(PostgreSQL)或_ "github.com/go-sql-driver/mysql"(MySQL) - 下划线
_表示只执行包初始化,不引入符号;没这行,sql.Open就找不到可用驱动,编译器认为sql包未被真正使用,进而报undefined - 驱动包路径必须准确,比如 MySQL 官方驱动是
github.com/go-sql-driver/mysql,少一个字符都不行
真正容易被忽略的,是 Go 构建模型对“包”的严格定义:它不靠目录自动聚类,也不靠文件名推测用途,一切依赖显式声明——import 路径、package 声明、go run 的目标粒度,三者缺一不可。写错任意一个,undefined 就立刻出现,而且错误信息往往只告诉你“找不到”,不告诉你“为什么找不到”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











