Go 入门(00):环境搭建与第一个程序
更新时间:2026-08-30。本文是
languages/go/beginner/入门层第 0 篇。零基础也能跟着做,目标是跑通第一个 Go 程序,并搞清楚 Go 的工程入口约定。后续衔接 Go 语法基础。
一、先搞清楚:Go 是什么、为什么本站讲它
Go(常称 Golang) 是 Google 2009 年发布的静态类型、编译型语言,主打"简单语法 + 原生并发(goroutine)+ 快速编译 + 垃圾回收"。本站主线是 Linux 性能剖析与低延迟编程,而 Go 恰好是把"底层功力变成工程生产力"的载体——它的并发模型、内存模型、pprof 剖析都和本站 C/C++ 主线深度相通(见 Go 实战入门总纲)。
你不需要先懂 C,但如果你读过本站 C 语言部分,会发现 Go 的很多设计(值/指针、逃逸分析、调用约定)都能在 C 里找到影子。
二、安装工具链
方式一:官方二进制(推荐) 到 go.dev/dl 下载对应系统的安装包,装完 go 命令就在 PATH 里。验证:
go version # 输出类似 go version go1.22.5 linux/amd64
go env GOROOT # Go 安装根目录
go env GOPATH # 你的工作区(默认 ~/go)方式二:版本管理器(多版本切换) 用 gvm 或 asdf 管理多个 Go 版本,适合要同时维护老项目的场景。
GOPATH 与 GOMODCACHE:早期 Go 靠
GOPATH找代码(所有项目挤在一个目录),Go 1.11 引入 Go Modules(模块) 后,项目自带go.mod声明依赖,不再受 GOPATH 限制。GOMODCACHE是下载的第三方包缓存目录。现在默认用模块模式,你基本不用手动碰 GOPATH 了——但知道它存在,排错时(比如缓存污染)有用。
三、第一个模块与程序
新建目录并初始化模块:
mkdir hello && cd hello
go mod init example.com/hello # 生成 go.mod,example.com/hello 是模块路径新建 main.go:
package main // 声明属于 main 包
import "fmt" // 导入标准库 fmt(格式化 I/O)
func main() { // 程序入口函数,无参数无返回值
fmt.Println("你好,Go!") // 打印一行并换行
}跑起来:
go run main.go # 编译到临时目录并运行,不保留二进制
go build -o hello . # 编译出可执行文件 hello
./hello # 运行你好,Go!为什么必须是
package main+func main()? Go 程序链接成可执行文件时,链接器要找唯一的入口符号main.main。package main告诉编译器"这个包要编进可执行文件",func main()就是那个入口。其他包(比如你写的工具包)不叫 main,编译后只是库,不会被链接成程序。这和 C 的int main()是同一个角色。
四、Go 程序的编译与运行模型
用一张图看 go run 和 go build 的区别:
关键认知:
go run不是"解释执行"——它仍然先编译再运行,只是把中间二进制放到临时目录、跑完就删。go build则是把二进制留下来。所以 Go 永远是编译型,启动快、部署只需一个静态二进制(没有运行时依赖),这也是它在云原生里吃香的原因。
五、常见坑
- 模块路径别乱写:
go mod init的路径最好是能反映仓库地址的(如github.com/you/proj),后续引内部包时路径要对得上。 go: cannot find main module:说明不在模块目录里,确认当前目录有go.mod,或用go mod init初始化。- 代理拉不到包:国内常需设
GOPROXY,例如go env -w GOPROXY=https://goproxy.cn,direct。 - 改了代码
go run没生效:不可能——go run每次都重新编译。若"没生效"多半是跑错了目录或文件名。
相关命令与延伸
工程组织细节见 Go pprof 剖析与工程组织;并发模型见 goroutine 与 channel;语法速览见 Go 语法基础。
一句话总结
Go 入门第 0 步:装好工具链 → go mod init 建模块 → 写 package main + func main() 入口 → go run 编译即跑、go build 留二进制。Go 是编译型语言,go run 也会先编译;模块模式(go.mod)取代了老式 GOPATH,是现在的标准工程方式。