控制结构
if-else
// 常规写法
if condition1 {
// do something
} else if condition2 {
// do something else
} else {
// catch-all or default
}
// 支持初始化的格式
if initialization; condition {
// do something
}
即使当代码块之间只有一条语句时,大括号也不可被省略
当 if 结构内有 break、continue、goto 或者 return 语句时,Go 代码的常见写法是省略 else 部分
函数多返回值
Go 语言的函数经常使用两个返回值来表示执行是否成功: (也称为comma,ok 模式
)
- 返回某个值以及 true 表示成功;
- 返回零值(或 nil)和 false 表示失败
if comma, err := process(); err != nil {
// todo
}
switch
// 第一种(候选值或能产生候选值的初始化语句)
switch var1|initialization {
case val1:
...
case val2, val3, val4:
...
default:
...
}
// 第二种
// 任何支持进行相等判断的类型都可以作为测试表达式的条件,包括 int、string、指针等
switch {
case condition1:
...
case condition2:
...
default:
...
}
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值
可以同时测试多个可能符合条件的值,使用逗号分割
不需要特别使用 break
语句来表示结束
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough
关键字来实现
switch i {
case 0: // 空分支,只有当 i == 0 时才会进入分支
case 1:
f() // 当 i == 0 时函数不会被调用
}
可以使用 return
语句来提前结束代码块的执行
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型
for
基于计数器
for init; condition; post { }
// for i := 0; i < 10; i++ {} 倒序也可以
特别注意,永远不要在循环体内修改计数器
可以在循环中同时使用多个计数器
循环嵌套
ASCII 编码的字符占用 1 个字节,既每个索引都指向不同的字符,而非 ASCII 编码的字符(占有 2 到 4 个字节)不能单纯地使用索引来判断是否为同一个字符
基于条件判断
for condition { }
无限循环
for { }
// 需要使用 break 或 return 跳出循环
经典应用是服务器,用于不断等待和接受新的请求
for-range
可以迭代任何一个集合(包括数组、map、切片)
for ix, val := range coll { }
break & continue
break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)
continue 忽略剩余的循环体而直接进入下一次循环的过程,但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件
continue 只能被用于 for 循环中
标签 & goto
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:
)结尾的单词
标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母
LABEL1:
for i := 0; i < 6; i++ {
// todo 嵌套循环时用的比较多
// contiune LABEL1
// break LABEL1
}
不建议使用 goto