Go 简介
出身、设计哲学、和 C++/Java/Python 的取舍对比。
Key PointsGo 的哲学是「少即是多」:一种循环、一种错误处理、一种并发原语。
出身
Started inside Google in 2007, open-sourced in 2009, 1.0 in 2012. The trigger was the authors' frustration waiting for large C++ builds. One stated goal: compile times short enough to wait for in a single thought.
和别的语言比
| Aspect | Go | C++ | Java | Python |
|---|---|---|---|---|
| 编译 | 秒级 | 分钟级 | JVM 启动慢 | 解释执行 |
| 并发 | goroutine 内置 | 线程 + 库 | 线程池 | GIL 限制 |
| 部署 | 单个二进制 | 依赖 .so | 需要 JRE | 需要解释器 |
| 内存 | GC,低延迟 | 手动 | GC | GC |
| 泛型 | 1.18 起有,较简单 | 模板,复杂 | 擦除式 | 动态 |
一段代码看清风格
Go
package main
import (
"errors"
"fmt"
)
// 返回值带 error,调用方必须处理
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为零")
}
return a / b, nil
}
func main() {
r, err := divide(10, 0)
if err != nil {
fmt.Println("出错:", err)
return
}
fmt.Println("结果:", r)
}Output
出错: 除数不能为零Two things to notice: error is an ordinary return value, not an exception; and if err != nil will be the three lines you write most. That is Go's entire error model.
谁在用
- Docker / Kubernetes / containerd —— 云原生底座
- Prometheus / Grafana / etcd —— 可观测性与协调服务
- Terraform / Vault —— 基础设施即代码
- 字节、腾讯、B站的网关与中间件 —— 高并发场景
Go is not a do-everything language. It is clearly weaker than Python, C++ or Rust for GUIs, ML training and scientific computing. Choose it for server-side concurrency and deployment cost, not versatility.
出身
2007 年在 Google 内部启动,2009 年开源,2012 年发布 1.0。起因是几位作者厌倦了在几十万行的 C++ 代码里等编译。传说中 Go 的设计目标之一就是「编译时间必须能用一次思考来等」。
和别的语言比
| 对比项 | Go | C++ | Java | Python |
|---|---|---|---|---|
| 编译 | 秒级 | 分钟级 | JVM 启动慢 | 解释执行 |
| 并发 | goroutine 内置 | 线程 + 库 | 线程池 | GIL 限制 |
| 部署 | 单个二进制 | 依赖 .so | 需要 JRE | 需要解释器 |
| 内存 | GC,低延迟 | 手动 | GC | GC |
| 泛型 | 1.18 起有,较简单 | 模板,复杂 | 擦除式 | 动态 |
一段代码看清风格
Go
package main
import (
"errors"
"fmt"
)
// 返回值带 error,调用方必须处理
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("除数不能为零")
}
return a / b, nil
}
func main() {
r, err := divide(10, 0)
if err != nil {
fmt.Println("出错:", err)
return
}
fmt.Println("结果:", r)
}Output
出错: 除数不能为零注意两点:error 是普通返回值而不是异常;if err != nil 会成为你写得最多的三行。这就是 Go 的全部错误处理模型。
谁在用
- Docker / Kubernetes / containerd —— 云原生底座
- Prometheus / Grafana / etcd —— 可观测性与协调服务
- Terraform / Vault —— 基础设施即代码
- 字节、腾讯、B站的网关与中间件 —— 高并发场景
Go 不是「什么都能写」的语言。GUI、机器学习训练、科学计算这些领域它明显弱于 Python/C++/Rust。选它是因为服务端并发与部署成本,不是因为它万能。