主题
第01章 Go 入门篇 —— 从认识 Go 到跑通第一个程序
本章目标:理解 Go 是什么、为什么火、安装好开发环境、写出并运行你的第一个 Go 程序。
1. Go 到底是什么?
用一句话描述:Go(也叫 Golang)是 Google 在 2009 年开源的一门编译型、静态类型、原生支持并发的编程语言。
🌰 生活化比喻
把编程语言比作做菜的工具:
| 工具 | 编程语言 | 特点 |
|---|---|---|
| 微波炉 | Python | 加热快、操作简单,但火力有限(性能) |
| 燃气灶 | Java | 火力足、功能多,但点火慢(启动慢、JVM) |
| 现代电磁灶 | Go | 点火即开(启动快)、火力够(高性能)、自带定时(并发)、操作简单(语法少) |
| 柴火灶 | C/C++ | 火力最猛、但要劈柴生火(手动管理内存) |
Go 想做的事:把 Python 的开发效率 + C 的运行性能 + Java 的工程化能力集成到一起。
Go 的设计哲学(记住三句话)
- 少即是多(Less is More):关键字只有 25 个,没有继承、没有泛型(1.18 前)、没有异常
- 大道至简:写代码就一种推荐写法,团队协作几乎不会因为风格吵架
- 天生云原生:Docker、Kubernetes、etcd、Prometheus 都是 Go 写的
2. 为什么应该学 Go?
2.1 业界使用情况
后端服务器:腾讯、字节、滴滴、B 站大量用 Go 重写老服务
云原生:K8s、Docker、Istio、Terraform 全是 Go
区块链:以太坊客户端、Hyperledger Fabric
中间件:etcd、Consul、TiDB、Caddy2.2 Go 的核心卖点
💪 编译快 编译速度比 C++ 快 10 倍以上
💪 性能强 接近 C,远超 Python/Node.js
💪 并发牛 goroutine 比线程轻量 1000 倍
💪 部署易 单文件二进制,没有依赖
💪 标准库全 自带 HTTP 服务器、JSON、加密、模板📊 配套图解:diagrams/go-positioning.svg —— Go 在编程语言中的定位
3. 安装 Go 环境
3.1 下载安装包
打开官网 https://go.dev/dl/,选择对应系统的安装包:
- Windows:下载
go1.22.x.windows-amd64.msi,双击下一步即可 - macOS:下载
go1.22.x.darwin-arm64.pkg(M 系列芯片)或amd64.pkg(Intel) - Linux:下载
go1.22.x.linux-amd64.tar.gz,解压到/usr/local
3.2 验证安装
打开终端(Windows 用 PowerShell):
bash
go version
# 输出示例:go version go1.22.0 darwin/arm64看到版本号就说明装好了 🎉
3.3 关键环境变量(理解一遍即可)
| 变量 | 作用 | 默认值 |
|---|---|---|
GOROOT | Go 安装目录 | /usr/local/go 等 |
GOPATH | 工作目录(老版本概念) | ~/go |
GOPROXY | 模块代理 | https://proxy.golang.org |
GO111MODULE | 是否启用 Module | on(默认) |
💡 国内同学务必设置代理,否则下载第三方包会龟速:
bash
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=off📊 配套图解:diagrams/go-workflow.svg —— Go 工程从源码到运行的全过程
4. 你的第一个 Go 程序
4.1 经典 Hello World
新建文件 hello.go:
go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}运行:
bash
go run hello.go
# 输出:Hello, World!4.2 这 5 行代码到底在干什么?
┌─────────────────────────────────────┐
│ package main ← 我属于 main 包(程序入口包)│
│ import "fmt" ← 借用别人写好的 fmt 工具箱 │
│ func main() { ← 这是程序的"大门" │
│ fmt.Println(...) ← 调用 fmt 里的 Println 打印 │
│ } │
└─────────────────────────────────────┘🌰 用快递公司类比
package main= 这家快递公司叫 mainimport "fmt"= 我借用顺丰公司(fmt)的运输能力func main()= 这家公司的总经理办公室,上班第一件事fmt.Println= 顺丰公司里有个员工叫 Println,专门负责"打印输出"
📊 配套图解:diagrams/hello-world-anatomy.svg —— 一个 Go 程序的解剖图
4.3 编译为可执行文件
bash
go build hello.go
# 当前目录会出现 hello(macOS/Linux)或 hello.exe(Windows)
./hello
# 输出:Hello, World!go build 把源码编译成单个二进制文件,可以直接拷贝到任何同架构的机器上运行,不需要装 Go 环境。这就是 Go 部署友好的原因。
4.4 go run vs go build
| 命令 | 作用 | 场景 |
|---|---|---|
go run | 编译 + 立即运行(不留产物) | 开发调试 |
go build | 只编译,生成可执行文件 | 发布部署 |
go install | 编译 + 把产物放到 $GOPATH/bin | 全局命令 |
5. 一个稍微有意思一点的程序
试试看下面这个 greeting.go:
go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
fmt.Print("请输入你的名字:")
reader := bufio.NewReader(os.Stdin)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
fmt.Printf("Hello, %s!欢迎来到 Go 的世界 🚀\n", name)
}运行后它会等你输入名字,然后跟你打招呼。这里能看到 Go 的几个特色:
import可以一次导入多个包(用括号包起来)- 多返回值:
reader.ReadString返回两个值——读到的字符串和错误 - 用
_表示忽略某个返回值(这里我们暂时不处理错误) fmt.Printf和%s是 C 风格的格式化输出
6. Go 工程目录长什么样?
一个标准 Go 项目大概是这样:
my-project/
├── go.mod # 模块定义文件(类似 package.json)
├── go.sum # 依赖校验文件
├── main.go # 程序入口
├── internal/ # 仅本项目可用的私有代码
│ └── service/
├── pkg/ # 可被外部项目引用的代码
├── cmd/ # 多个可执行入口
│ └── server/
├── api/ # API 定义(proto 文件等)
├── configs/ # 配置文件
└── README.md别急,第10章会专门讲 Module 和工程组织。现在你只需要知道一个 .go 文件就能跑起来就够了。
📊 配套图解:diagrams/project-structure.svg —— Go 标准项目目录
7. 编辑器推荐
| 编辑器 | 推荐度 | 配置 |
|---|---|---|
| VSCode + Go 插件 | ⭐⭐⭐⭐⭐ | 装 golang.go 一键搞定 |
| GoLand | ⭐⭐⭐⭐⭐ | 收费,但是 JetBrains 全家桶用户的福音 |
| Vim/Neovim + LSP | ⭐⭐⭐⭐ | 极客向 |
| Sublime + LSP | ⭐⭐⭐ | 轻量但要自己折腾 |
VSCode 装好后第一次打开 .go 文件,它会问你要不要装 gopls、dlv 等工具,全部点 Install 就行。
8. 本章小结
✅ Go 是 Google 出品的、追求"简单+高性能+并发友好"的现代语言
✅ 适合写后端服务、云原生中间件、CLI 工具
✅ 一个 .go 文件 + package main + func main() 就能跑起来
✅ go run 用于开发,go build 用于发布
✅ 国内务必设置 GOPROXY=https://goproxy.cn,direct
下一章我们来学变量、常量与基本数据类型——程序的"原材料"。
📂 配套资源
- examples/01_hello.go —— 经典 Hello World
- examples/02_greeting.go —— 交互式问候
- examples/03_args.go —— 命令行参数
- demo.html —— 浏览器可视化演示
- interview.md —— 面试题精选
- diagrams/ —— SVG 图解