1、条件语句
1.1if—else结构
if a>1{
//do something
}
//存在else分支
if a>1{
//do something
}else{
//do something
}
//分支可以有很多个
if a>1{
//do something
}else if a>0{//前段代码块的右大括号 }必须和 else-if 关键字在同一行
//do something
}else{
//do something
}
注意事项:if—else条件语句中声明的变量只在条件语句中存在,如果和成员变量有相同的名字,则成员变量被隐藏。
1.2switch结构
switch i{
case -1,0: //当代码块只有一行时,可以直接放置在 case 语句之后。
//do something不需要使用花括号将多行语句括起来
case 1:
//do something
case 2:fallthrough//如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的
//do something
...
default: //可选
//do something
}
//switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switch x.(type){
case type:
//do something
case type:
//do something
}
1.3select结构
select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。
涉及通信channel,暂时跳过。
2、循环语句
如果想要重复执行某些语句,Go 语言中您只有 for 结构可以使用。
基本形式为:for 初始化语句; 条件语句; 修饰语句 {}
2.1for循环
//基于计数器的迭代
for i := 0;i<5;i++{
//do something
}
//可以在循环中同时使用多个计数器
for i, j := 0, N; i < j; i, j = i+1, j-1 {}
//循环嵌套
for i:=0; i<5; i++ {
for j:=0; j<10; j++ {
//do something
}
}
//基于条件判断的迭代,没有初始化语句和修饰语句的 for 结构
for i>0{
//do something
i--
}
//无限循环
//如 i:=0; ; i++ 或 for { } 或 for ;; { } ( ;; 会在使用 gofmt 时被移除)或for true { } 或for { } 。
//
2.2for-range结构
它可以迭代任何一个集合(包括数组和 map)
一般形式:for ix, val := range collection { }
要注意的是, val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值(如果 val 为指针,则会产生指针的拷贝,依旧可以修改集合中的原值)。
2.3break、continue、goto
一个 break 的作用范围为该语句出现后的最内部的结构。但在 switch 或 select 语句中,break 语句的作用结果是跳过整个代码块,执行后续的代码。关键字 continue 忽略剩余的循环体而直接进入下一次循环的过程
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue//break
}
fmt.Print(i)
}
}
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用。可以使用 goto 语句和标签配合使用来模拟循环(在发生读取错误时,使用 goto 来跳出无限读取循环并关闭相应的客户端链接)。
func main() {
MYLABEL:
for i := 0; i < 10; i++ {
if i == 5 {
continue MYLABEL//跳转到 LABEL1 标签的位置
}
fmt.Print(i)
}
}
func main() {
i:=0
HERE:
print(i)
i++
if i==5 {
return
}
goto HERE
}