3. 变量、类型与流程控制
这是什么:变量 = 给数据起的名字,一个贴了标签的盒子;类型 决定盒子装什么,流程控制 决定代码走哪条路。
为什么用:上一章我们让电脑说了第一句话,但它转头就忘——程序不会记数据,也不会看情况办事。没有变量,数值只能写死;没有分支循环,代码永远是一条直线。
如何用:先用 var 和 := 两种写法声明变量,再把 int、string、bool 这些基本类型挨个试一遍,最后用 if、for、switch 走一遍流程。
3.1 声明变量的两种方式
func main() {
var name string = "青蛙" // 传统式:var 名 类型 = 值
var age = 11 // 类型可推断,可省
city := "杭州" // ☆ 短声明(: := ),只能在函数内用
}
| 写法 | 场景 |
|---|---|
var x int |
零值默认(int → 0,string → "",bool→false) |
x := 10 |
日常主力(函数内) |
| 常量 | const PI = 3.14 |
Go 的未使用变量会报编译错——「声明而不用」在 Go 里是错误,强迫代码整洁。
3.2 基本类型速查
var i int = 42 // 整数,默认 64 位平台 int64
var f float64 = 3.14 // 浮点(默认 float64)
var s string = "hello" // 字符串(UTF-8 原生)
var b bool = true
var r rune = '蛙' // rune = int32,存 Unicode 字符
字符串常用操作:
fmt.Println(len("青蛙")) // 6(字节数!中文 3 字节)
fmt.Println(len([]rune("青蛙"))) // 2(字符数)
fmt.Println(strings.ToUpper("go")) // GO
fmt.Printf("%d %.2f %s\n", 42, 3.14, "ok")
3.3 条件:if(不需要括号)
if score >= 60 {
fmt.Println("及格")
} else if score >= 0 {
fmt.Println("不及格")
} else {
fmt.Println("无效分数")
}
// 做初始化的 if(Go 特色)
if n := len(s); n > 5 {
fmt.Println("长字符串", n)
}
大括号必写、跟 if 同行;Go 存在条件表达式,无三元。
3.4 循环:只有 for
for i := 0; i < 5; i++ { // 1. 经典三段
fmt.Println(i)
}
for { // 2. 无限(配 break)
break
}
nums := []int{1, 2, 3}
for index, value := range nums { // 3. 遍历(range)
fmt.Println(index, value)
}
m := map[string]int{"a": 1}
for k, v := range m { // 4. map 同理
fmt.Println(k, v)
}
你会看到:for 一统天下——没有 while 没有 do-while,统一用 for。
3.5 switch(默认自带 break)
switch os := runtime.GOOS; os {
case "windows":
fmt.Println("Windows")
case "linux", "darwin": // 逗号=多值
fmt.Println("类 Unix")
default:
fmt.Println("其它")
}
口诀:if 无括号、for 一条、switch 默认 break。格式统一全体党员一致性。
3.6 动手改
- 用 for + range 打印字符串中每个字符(
for i, ch := range str) - 写「猜大小」switch 分支,默认 case 输出合理原因
- 故意声明不用变量,看编译器怎么教育你
3.7 小结
:=为日常,var用于显式类型与包级- len 对中文按字节;需要字符数用
[]rune - for 一条承担循环;switch 自带 break
下一章:函数与包 🐸