Go 语言入门与程序执行
从零理解 Go
第一章:认识 Go——为什么我们要学习它?
1.1 Go 是什么?
Go(Golang)
Go 是一种由 Google 开发的静态类型、编译型、具有垃圾回收机制的通用编程语言。
它的设计尤其重视简洁性、可维护性、工程效率和并发编程。
Go 于 2009 年公开发布,设计者包括 Robert Griesemer、Rob Pike 和 Ken Thompson。
这里有一个值得思考的问题:
为什么 Google 这样的公司需要专门设计一门新语言?
因为大型软件工程中存在几个长期问题:
- 编译速度慢,开发反馈周期长。
- 复杂语言特性增加团队协作和维护成本。
- 并发程序开发复杂,容易产生错误。
- 大型代码库需要统一、简单的工程规范。
Go 希望在执行效率、开发效率和工程可维护性之间取得平衡。
1.2 Go 和 Python 的本质区别
| 维度 | Python | Go |
|---|---|---|
| 类型系统 | 动态类型 | 静态类型 |
| 主要执行方式 | 通常由解释器执行字节码 | 编译为机器代码 |
| 变量声明 | 通常不声明类型 | 通常需要明确或推断类型 |
| 内存管理 | 自动垃圾回收 | 自动垃圾回收 |
| 并发工具 | Thread、asyncio、multiprocessing | Goroutine、Channel |
| 错误处理 | 异常机制 | 显式 Error 返回值 |
| 面向对象 | Class、继承 | Struct、Interface、组合 |
三个关键点。
第一个:静态类型。
Python:
x = 10
x = "hello"
这在 Python 中是合法的。
Go:
var x int = 10
x = "hello" // 编译错误
为什么?
因为 Go 的变量具有确定的静态类型。x 一旦声明为 int,就不能直接赋值为字符串。
这意味着很多类型错误可以在程序运行之前被编译器发现。
第二个:编译执行。
Python 通常通过解释器运行程序:
python main.py
Go 通常先编译:
go build main.go
生成可执行文件,再运行:
./main
Go 也提供:
go run main.go
它会帮助你完成编译和运行,适合开发阶段。
第三个:并发设计。
Python 有 Thread 和 asyncio 等并发工具。
Go 则把 Goroutine 作为语言生态中的重要并发抽象。
第二章:搭建 macOS Go 开发环境
现在进入真正的动手环节。
- 列表项
- 列表项
你的开发环境是:
- 操作系统:macOS
- 编辑器:VS Code
- 终端:macOS Terminal 或 VS Code 集成终端
- 编程语言:Go
我们的目标是建立一个以后所有 Go 项目都能复用的开发环境。
2.1 先理解 Go 开发环境由什么组成
一个完整的 Go 开发环境主要包含四个部分:
| 工具 | 作用 |
|---|---|
| VS Code | 编辑 Go 源代码 |
| Go Extension + gopls | 代码补全、跳转、诊断、调试支持 |
| Go Toolchain | 编译器、链接器、go 命令及标准工具 |
| macOS | 加载并运行编译后的程序 |
第三章:Go 程序究竟是怎么执行的?
3.1 先理解编译型语言
我们从 Python 对比开始。
Python 代码:
print("Hello Python")
通常执行:
python main.py
Python 解释器负责读取和执行程序。
Go 代码:
package main
import "fmt"
func main() {
fmt.Println("Hello Go")
}
通常执行:
go build
Go 编译器将 Go 源代码编译为机器代码,链接器再将程序需要的代码组织成可执行文件。
整体流程可以理解为:
Go 程序执行流程

这也是为什么 Go 通常被称为编译型语言。
3.2 Go 的三个重要命令
- 命令 A:go run
go run main.go作用:编译并运行 Go 程序。
适合开发阶段快速测试。
注意:它并不意味着 Go 直接解释执行源代码,而是背后仍然需要编译。
- 命令 B:go build
go build作用:编译当前包,生成可执行文件。
适合构建项目。
例如:
go build -o inventory会将构建结果命名为
inventory。
- 命令 C:go install
go install作用:编译并安装 Go 包或可执行程序。
对于可执行程序,默认会安装到 Go 的可执行工具目录,通常是
$(go env GOPATH)/bin。
3.3 一个重要问题:Go 程序从哪里开始执行?
观察这个程序:
package main
import "fmt"
func main() {
fmt.Println("Hello Go")
}
其中:
func main()
是程序的入口函数。
先理解两个不同的概念:
package main:声明当前文件所属的包是特殊的可执行程序包。func main():声明程序启动后执行的入口函数。
它们不是同一个东西。
如果你未来写一个普通工具库,例如:
package inventory