Go 的流程控制
Go中最常用的流程控制有
if
和for
,而switch
和goto
主要是为了简化代码、降低重复代码而生的机构,属于扩展类的流程控制
if 条件判断
与 JavaScript的 if 条件判断逻辑是相同的,但写法上还是有一些区别的 ~
package main
import "fmt"
func main() {
score := 75
if score >= 90 {
fmt.Println("A")
} else if score >= 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
如上示例,我们会发现Go中if 语句是不需要加括号的,其实加了也不影响(格式化也会帮你去掉的),与 JavaScirpt 最大的区别是简单判断时,{ } 是不能省略的,如下所示:
func main() {
flag := true
if !flag fmt.Println("!flag")
}
# command-line-arguments
# syntax error: unexpected fmt, expected {
# syntax error: unexpected }, expected expression
注意:if 语句 的两种写法及区别,如下所示:
- 当前区域内的全局变量
func main() {
age := 24
if age > 20 {
fmt.Println("成年人", age)
}
fmt.Println(age)
}
# 成年人 24
# 24
- 局部变量
func main() {
if age := 24; age > 20 {
fmt.Println("成年人", age)
}
fmt.Println(age)
}
# command-line-arguments
# undefined: age
for 循环
基本和 JavaScript 相同
package main
import "fmt"
func main() {
for i := 0; i <= 10; i++ {
fmt.Println("i = ", i)
}
}
# i = 0
# i = 1
# i = 2
# i = 3
# i = 4
# i = 5
# i = 6
# i = 7
# i = 8
# i = 9
# i = 10
Go中时没有 while
语句的,所以我们可以通过 for
来实现,如下所示:
func main() {
i := 0
for {
if i <= 10 {
fmt.Println("i = ", i)
} else {
break
}
i++
}
}
for range (键值循环)
Go中可以使用
for range
遍历数组、切片、字符串、map及通道
- 数组、切片、字符串返回其索引和值
- map返回其键和值
- 通道只返回通道内的值
以字符串为示例:
其中 index 是数组中每个元素的索引,而 value 则是索引所对应的值
package main
import "fmt"
func main() {
str := "你好Golang"
for index, value := range str {
// value输出的为码表中对应的值(字符类型中有详细说明)
fmt.Println("index =", index, "value =", value)
// 以下代码则输出对应值
// fmt.Printf("index = %v index = %c \n", index, value)
}
}
# index = 0 value = 20320
# index = 3 value = 22909
# index = 6 value = 71
# index = 7 value = 111
# index = 8 value = 108
# index = 9 value = 97
# index = 10 value = 110
# index = 11 value = 103
注意:for 循环是不能循环 含有中文的字符串
-
for 循环,得到的类型是
uint8
也就是byte
类型,对应ASCII编码表,而中文字符在ASCII编码表中没有相对应的ID,所以循环含有中文的字符串时会出现乱码 -
使用 for range 时,得到类型是
int32
,对应Unicode编码
匿名变量
以下示例中的 _
表示匿名变量,在正常情况下我们定义了变量但未使用会抛出错误,而使用匿名变量则可以避免报错
func main() {
// 切片
arr := []string{"JavaScript", "Golang", "Node"}
for _, value := range arr {
fmt.Println("value = ", value)
}
}
# value = JavaScript
# value = Golang
# value = Node
switch case
与 if 条件判断一样,也同样分为了 局部变量写法 和 当前区域内的全局变量的写法 ~
func main() {
week := 1
switch week {
case 4:
fmt.Println("疯狂星期四 vivo50")
break
case 5:
fmt.Println("周五周五 生龙活虎")
break
case 6, 7:
fmt.Println("快乐周末")
break
default:
fmt.Println("打工仔的苦日子")
}
}
# 打工仔的苦日子
在 JavaScript 中 switch 中的 break 如果不写表示穿透,而在Go中 switch 的 break 不写倒则没有此影响,Go中 switch 的穿透则需要使用 fallthrough
,但是需要注意:fallthrough
仅能穿透紧挨着它的一层(一般项目中也不会这么用,所以看看了解即可),如下所示:
func main() {
switch week := 5; week {
case 4:
fmt.Println("疯狂星期四 vivo50")
case 5:
fmt.Println("周五周五 生龙活虎")
fallthrough
case 6, 7:
fmt.Println("快乐周末")
default:
fmt.Println("打工仔的苦日子")
}
}
# 周五周五 生龙活虎
# 快乐周末
case 语句
- 用于循环语句中跳出循环,并开始执行循环之后的语句
- break 在 switch 中在执行一条 case 后跳出语句的作用
- 在多重循环中,可以用标签 如:lable1 标出想 break 的循环,如下所示:
func main() {
lable1:
for i := 0; i < 2; i++ {
for j := 0; j < 10; j++ {
if j == 3 {
break lable1
}
fmt.Printf("i = %v j= %v \n", i, j)
}
}
}
# i = 0 j= 0
# i = 0 j= 1
# i = 0 j= 2
continue
表示立即跳出本次循环,继续下一次循环(仅在 for 循环内使用),与 JavaScript 中的 continue关键字相同
go to
通过标签进行代码间的无条件跳转(可以快速跳出循环,避免重复)