基础语法与类型
variables、zero-values、const/iota、控制流、基本类型。
基础语法与类型
这一课你将能做到
- 用
var、:=、const三种方式声明变量和常量,并说出每个类型的零值 - 熟练使用 if / for / switch 三种控制流,包括 Go 特有的「初始化语句」写法
- 编写带多返回值、命名返回值和可变参数的函数
为什么要学
任何程序都是「数据 + 流程」。这一课把 Go 的数据怎么声明、流程怎么控制一次讲透。Go 语法刻意做减法:循环只有 for 一种,分支只有 if 和 switch,没有 do-while,也没有三元运算符。花 35 分钟掌握这一课,就能读懂 90% 的 Go 控制流代码,这也是后面切片、接口、并发一切内容的地基。
从 Java/JS 转过来的初学者会踩三个坑:声明的变量不用会编译报错;类型转换必须显式写;i++ 是语句不是表达式。这三个点下面都会遇到。
先建立图像
package main
import "fmt"
const (
StatusOK = iota + 200 // 200,iota 是 const 块的行号,从 0 开始
StatusFound // 201,自动延续上一行的表达式
)
func main() {
count := 10 // := 短声明,类型自动推断为 int
var ratio float64 // 零值 0
if count > 5 && ratio == 0 {
fmt.Println("count 偏大,ratio 未设置")
}
for i := 0; i < count; i++ {
if i%3 == 0 {
continue
}
}
switch n := count / 3; n {
case 1, 2:
fmt.Println("小")
default:
fmt.Println("大:", n)
}
fmt.Println(StatusOK, StatusFound) // 200 201
}
这一张图就是本课全部:声明、零值、if/for/switch、常量、iota。
跟着做
下面每步都可以放进同一个 go mod init example.com/syntax 的项目里运行。
步骤 1:变量声明的三种方式
package main
import "fmt"
func main() {
// 方式一:var 完整声明,可批量
var a int = 10
var b, c = 20, "三十"
// 方式二:var 省略类型,靠右值推断
var d = 3.14
// 方式三:短声明 :=,只能在函数内部使用
e := "hello"
fmt.Println(a, b, c, d, e)
}
规则:包级别只能用 var(:= 不可用),函数内推荐 :=。
步骤 2:零值——Go 没有「未初始化变量」
任何变量声明后不赋值,Go 自动给它确定的「零值」:
package main
import "fmt"
func main() {
var i int // 0
var f float64 // 0
var s string // ""(空串,不是 null!)
var b bool // false
var arr [3]int // [0 0 0]
var p *int // nil
var sl []int // nil(切片零值可直接 append)
var m map[string]int // nil(零值 map 只能读,写入会 panic)
fmt.Println(i, f, b, arr, p, sl, m)
fmt.Printf("%q\n", s) // "",用 %q 看清字符串边界
}
零值设计让很多类型「声明即可用」,不需要先初始化再使用。
步骤 3:基本类型一览
package main
import "fmt"
func main() {
i := 42 // int:位宽随平台(64 位系统上是 64 位)
i64 := int64(42) // 明确位宽:int8/16/32/64
f := 3.14 // float64 是默认浮点;没有叫 float 的类型
s := "golang" // 字符串:不可变的 UTF-8 字节序列
r := '中' // rune = int32 别名,表示一个 Unicode 码点
b := true
by := byte('A') // byte = uint8 别名
fmt.Printf("%T %T %T %T %T %T\n", i, i64, f, s, r, by)
fmt.Println(b)
}