本节摘要:环境搭建是动手优先的第一战。本节覆盖 Windows、macOS、Linux 三种系统的 Go 安装、版本验证、模块代理配置、模块初始化,以及用 go run 与 go build 两种方式运行 Hello World,并解释 go.mod 的每一行。读完你将拥有一个可长期使用的 Go 工作区。
阅读完本节,你应当能够:
Windows:从官网下载 MSI 安装包,双击安装,默认装到系统盘的 Go 目录,安装器会自动把可执行目录加进 PATH。装完开一个新的命令行窗口(必须是新窗口,旧窗口读不到更新后的环境变量),敲:
go version
看到类似 go version go1.22.x windows/amd64 就成功了。
macOS:两种方式任选——下载 pkg 安装包,或用 Homebrew 一条命令:
brew install go
Linux:下载 tar 包解压到系统目录,再把 bin 加进 PATH。解压位置按惯例放在系统的 local 目录下。
三种系统的验证命令完全一致,这也是 Go"跨平台一致性"的第一次体现。
接着配一个国内代理(如果直连慢),这是把模块下载切到国内镜像站,实际使用时把占位文字换成你选定的镜像域名再跟逗号和direct:
go env -w GOPROXY=镜像站点域名加逗号加direct
💡 关键直觉:GOPROXY 写成
镜像,direct的含义是"先走镜像,找不到再直连",逗号是回退链,不是二选一。
选个工作目录,执行:
go mod init hello
会生成一个 go.mod 文件,内容大致是:
module hello go 1.22
三行信息:模块名(module)、语言版本(go)、以及将来自动追加的依赖(require 块)。模块名默认只是本地标识;如果将来要发布到代码托管平台,惯例是写成仓库地址形式,比如某个托管域名加上你的用户名和仓库名。
⚠️ 常见坑:模块名与目录名可以不一致,但同一个工作区里不要嵌套两个 go.mod——编译器会认为这是两个独立模块,产生"找不到包"的怪异报错。
在模块里建一个文件,敲入:
package main import "fmt" func main() { fmt.Println("Hello, World!") }
四行结构值得逐行说清:
package main:声明这是可执行程序的入口包。写成别的名字就只是库,编不出可执行文件。import "fmt":导入标准库的格式化输出包。func main():main 包里的 main 函数是程序入口,没有参数也没有返回值。运行有两种方式。开发期热身用:
go run .
它编译到临时目录后立刻执行,不留产物。要看"部署形态"就用:
go build .
当前目录出现一个可执行文件,Windows 下带 .exe 后缀。这个文件是静态链接的——拷到一台没装 Go 的服务器上照样跑。这就是 Go 在容器时代如鱼得水的底层原因:镜像里只需要一个二进制加你的配置文件。

| 命令 | 作用 | 典型时机 |
|---|---|---|
| go mod init | 生成 go.mod | 新工程开工 |
| go run | 编译并立即运行 | 开发调试 |
| go build | 编译出二进制 | 交付与部署 |
| go fmt | 格式化代码 | 提交前 |
| go vet | 静态检查可疑代码 | 提交前 |
| go get | 拉取或升级依赖 | 引入第三方包 |
编辑器方面,VSCode 装官方 Go 扩展即可获得补全、跳转、保存自动格式化;JetBrains 的 GoLand 功能更全但要付费。两者都内置了上面这张表里的命令入口。
故障一:命令行提示找不到 go 命令。 九成是 PATH 没生效——Windows 装完 MSI 要开新窗口;Linux 手动解压的话检查 PATH 里是否包含解压目录下的 bin 子目录。
**故障二:拉依赖超时。**GOPROXY 没配或被覆盖,重新执行 go env -w 设置镜像即可,可用 go env 查看 GOPROXY 当前值确认。
故障三:编译报"不在模块内"之类的错。 当前目录不在任何 go.mod 管辖范围。回到模块目录再执行命令,Go 的所有构建命令都要求在模块内运行(传统的 GOPATH 模式已不推荐)。
环境既然好了,提前剧透一点 Go 的招牌——并发。在你刚建的模块里试试:
package main import ( "fmt" "time" ) func main() { go fmt.Println("我在另一个执行流里") // go关键字:并发执行 time.Sleep(time.Millisecond) // 暂停等它跑完(仅演示,第5章有正经同步法) fmt.Println("主流程收尾") }
把 go 那行删掉再跑一遍,对比输出顺序。这就是"goroutine"的第一面——细节全部留在第 5 章,这里只求一个体感:并发在 Go 里是语言内建的,不是库调出来的。
下一节进入语法:变量、常量与类型系统。