Go 语言入门系列(二):变量、类型与控制流——Go 的语法主干
本篇目标:掌握日常编码离不开的基础构件。Go 语法看起来"反直觉"的地方,背后都有一致性考量,讲清楚比死记更重要。
一、变量声明
三种写法:
var name string = "Gopher" // 完整
var age = 30 // 类型推断
count := 42 // 短声明,仅函数内可用
零值机制:只声明不赋值,变量自动获得零值——数值 0、字符串 ""、布尔 false、指针/slice/map/接口 nil。这避免了"未初始化"的混乱,也让结构体的零值通常直接可用。
声明必须使用:声明了局部变量却不用,编译报错。强制代码干净。
二、基本类型
整数:
int、int8/16/32/64、uint系列浮点:
float32、float64字符串:
string(不可变)布尔:
bool字符:
byte(uint8 别名)、rune(int32 别名,表示 Unicode 码点)
没有隐式转换,类型不同必须显式转:
var i int = 10
var f float64 = float64(i)
三、常量与 iota
const Pi = 3.14
const (
A = iota // 0
B // 1
C // 2
)
iota 在每个 const 块内从 0 递增,适合定义枚举。
四、控制流
if——条件前可带初始化语句,变量只在块内可见,错误处理常用:
if err := doSomething(); err != nil {
fmt.Println(err)
}
for——Go 只有 for,覆盖所有循环:
for i := 0; i < 5; i++ { } // 经典三段式
for n < 3 { n++ } // 类似 while
for i, v := range slice { } // 遍历
for { } // 无限循环
switch——默认不穿透,无需 break;可无表达式:
switch {
case n < 0:
fmt.Println("负")
case n == 0:
fmt.Println("零")
default:
fmt.Println("正")
}
五、函数
多返回值是 Go 的特征,直接塑造了错误处理风格:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("除数不能为零")
}
return a / b, nil
}
result, err := divide(10, 2)
if err != nil {
return
}
同类型参数合并声明:
a, b int可变参数:
func sum(nums ...int)命名返回值:
func f() (n int),初学建议少用,未命名更清晰
六、值传递与指针
Go 全是值传递。传参时复制一份,函数内改不到外面。需要修改原值或避免大结构体复制时用指针:
func inc(p *int) { *p++ }
x := 1
inc(&x) // x 变成 2
& 取地址,* 解引用。指针本身也是值传递,传的是地址的副本。
七、小结
声明三种写法,零值机制让变量总有合法初始值,声明必须使用
类型写在变量名后,无隐式转换
for统一循环,switch默认不穿透多返回值 +
error是 Go 错误处理的基础全是值传递,需要改原值用指针
练习:写一个 minMax(nums []int) (int, int, error),切片为空时返回 error,否则返回最小最大值,在 main 里判断错误并打印。
下一篇讲复合类型:切片、map、结构体与方法——用 Go 的方式组织数据。

浙公网安备 33010602011771号