1.2 开发环境搭建与第一个程序


1.2 开发环境搭建与第一个程序

本节摘要:环境搭建是动手优先的第一战。本节覆盖 Windows、macOS、Linux 三种系统的 Go 安装、版本验证、模块代理配置、模块初始化,以及用 go run 与 go build 两种方式运行 Hello World,并解释 go.mod 的每一行。读完你将拥有一个可长期使用的 Go 工作区。

本节目标

阅读完本节,你应当能够:

  1. 在任意主流系统上安装 Go 并验证版本;
  2. 配置国内模块代理以加速依赖下载;
  3. 用 go mod init 建立一个模块并解释 go.mod 内容;
  4. 区分 go run 与 go build 的使用时机;
  5. 排查三个最常见的环境故障。

一、安装:三种系统一条心

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 是工程的身份证

选个工作目录,执行:

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 函数是程序入口,没有参数也没有返回值。
  • 大括号的位置被 gofmt 强制规定为行尾,左括号换行会被编译器拒绝——这是有意为之,终结了持续几十年的风格圣战。

运行有两种方式。开发期热身用:

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 里是语言内建的,不是库调出来的

从源码到产物的两条路径

一节小结

  • 三平台一致:安装方式不同,但 go version 验证与后续所有命令完全一致。
  • GOPROXY 回退链:镜像在前、direct 在后,逗号分隔逐级回退。
  • go.mod 三要素:模块名、语言版本、依赖清单,是模块的身份证。
  • run 与 build 分工:run 是"试衣间",build 是"出厂";build 产物静态链接、免运行时。
  • main 包约定:package main 加无参 main 函数才构成可执行入口。
  • 排错三板斧:查 PATH、查代理、查当前目录是否在模块内。

下一节进入语法:变量、常量与类型系统。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U