Go 入门(01):语法基础——变量、类型、控制流
更新时间:2026-08-30。本文是
languages/go/beginner/第 1 篇,接 环境搭建。把最常用的语法点一次讲清,配能直接跑的例子。
一、变量与零值
Go 是静态类型语言——变量类型在编译期确定。声明有三种方式:
var a int = 10 // 完整声明
var b int // 只声明,自动赋"零值" 0
c := 20 // 短声明(:= 自动推导类型),仅函数内可用零值(zero value) 是 Go 的重要设计:任何变量声明后若未显式赋值,会被自动初始化为该类型的零值(数值 0、字符串 ""、布尔 false、指针 nil)。这避免了 C 里"未初始化变量是随机垃圾"的坑。
var s string
fmt.Println(s == "") // true,s 是空串而非乱码直觉:C 里
int x;之后x是栈上残值;Go 里var x int之后x一定是 0。零值让 Go 程序默认就处于"安全状态",这是它"简单且不易出错"哲学的体现。
二、基础类型
| 类别 | 类型 | 说明 |
|---|---|---|
| 整数 | int int8 int32 int64 / 对应 uint* | int 长度随平台(64 位机是 64 位) |
| 浮点 | float32 float64 | 默认用 float64 |
| 复数 | complex64 complex128 | 工程较少用 |
| 布尔 | bool | true/false |
| 字符串 | string | 不可变 UTF-8 字节序列 |
| 字节 | byte(=uint8) rune(=int32) | rune 表示一个 Unicode 码点 |
name := "性能剖析" // string,UTF-8
r := []rune(name) // 转成 rune 切片才能按"字符"索引
fmt.Println(len(name), len(r)) // 12(字节) 4(字符)字符串"不可变"意味着不能直接改某个字符,要改得先转成
[]byte或[]rune再改。这和 Java 的 String 类似,和 C 的char*可随意改不同。
三、常量与 iota
const Pi = 3.14159
const ( // 枚举风格
A = iota // 0
B // 1
C // 2
)iota 是预声明的常量生成器,在 const 块里从 0 自增,常用来定义枚举。比手写 0/1/2 不易错。
四、控制流:if / for / switch
if(条件无括号,但体必有花括号):
if x := compute(); x > 10 {
fmt.Println("大")
} else {
fmt.Println("小")
}注意
x := compute()写在if里——这是 Go 的"初始化语句",x只在 if/else 作用域内可见,避免污染外层。
for 是唯一循环关键字(Go 没有 while):
for i := 0; i < 3; i++ { fmt.Println(i) } // 经典三段式
for cond { } // 等价 while
for { } // 死循环
for i, v := range slice { } // 遍历切片/map/字符串switch(默认自动 break,不用写 break):
switch x {
case 1, 2:
fmt.Println("小")
default:
fmt.Println("其他")
}五、defer:延迟调用
defer 把函数调用推迟到当前函数返回前执行,常用于资源释放(关文件、解锁),类似 C++ 的 RAII 或 Python 的 with。
f, _ := os.Open("data.txt")
defer f.Close() // 函数返回前一定关
// ... 中间随便 return 或 panic,Close 都会执行多个
defer按后进先出(LIFO) 顺序执行。它让"获取-释放"成对出现、不会漏,是 Go 错误处理里最舒服的语法糖。
六、常见坑
- 短声明
:=只能在函数内用;包级变量必须用var。 - 未使用的变量/导入会编译报错——Go 强制"声明了就得用",倒逼代码整洁,但也常让调试时临时注释很烦。
for range取的是副本:for i, v := range s里v是元素副本,改v不影响原切片;要改得用s[i]。
相关与延伸
类型进阶(struct/interface/指针)会在「数据类型与结构」专篇展开(规划中);当前可先回 Go 实战入门总纲 的类型速览。并发模型见 goroutine 与 channel;零值机制与内存布局呼应 C 语言指针深入。
一句话总结
Go 语法基础:变量用 var 或 := 短声明,声明即零值(默认安全);类型是静态的,string 不可变;控制流只有 if/for/switch(for 统管所有循环);defer 延迟调用、LIFO 执行,是资源释放的好搭档。Go 强制"声明即用",代码因而整洁。