接着上一篇的知识点继续。。
03 常用语句及关键字
3.1 条件语句
和c语言类似,相关的条件语句如下表所示:
-
if 语句
if 语句 由一个布尔表达式后紧跟一个或多个语句组成。 -
if…else 语句
if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 -
switch 语句
switch 语句用于基于不同条件执行不同动作。 -
select 语句
select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 -
if语句
语法如下:
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
}
- if-else语句
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
} else {
/* 在布尔表达式为 false 时执行 */
}
- switch语句
其中的变量v可以是任何类型,val1和val2可以是同类型的任意值,类型不局限为常量或者整数,或者最终结果为相同类型的表达式。
switch v {
case val1:
...
case val2:
...
default:
...
}
- select语句
select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。它将会随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}
注意:
- 每个case必须都是一个通信
- 所有channel表达式都会被求值,所有被发送的表达式都会被求值
- 如果任意某一个通信都可以,它就执行,其他就忽略
- 如果有多个case都可以运行,select就会随机挑选一个来执行。
- 如果没有一个case可以被运行:如果有default子句,就执行default子句,select将被阻塞,直到某个通信可以运行,从而避免饥饿问题。
3.2 循环语句
3.2.1 循环处理语句
go中时使用for实现循环的,共有三种形式:
- 和c语言中的for相同 for init; condition; post {}
- 和c语言中的while相同 for condition{}
- 和c语言中的for(;;)相同 for{}
除此以外,for循环还可以直接使用range对slice、map、数组以及字符串等进行迭代循环,格式如下:
for key, value := range oldmap {
newmap[key] = value
}
3.2.2 循环控制语句
- break 中断跳出循环或者switch语句
- continue 跳过当前循环的剩余语句,然后继续下一轮循环
- goto语句 将控制转移到被标记的语句
- break
break主要用于循环语句跳出循环,和c语言中的使用方式是相同的。且在多重循环的时候还可以使用label标出想要break的循环。 实例代码如下:
a := 0
for a<5 {
fmt.Printf("%d\n", a)
a++
if a==2 {
break;
}
}
/* output
0
1
2
*/
- continue
Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。在多重循环中,可以用标号 label 标出想 continue 的循环。 实例代码如下:
// 不使用标记
fmt.Println("---- continue ---- ")
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue
}
}
/* output
i: 1
i2: 11
i2: 12
i2: 13
i: 2
i2: 11
i2: 12
i2: 13
i: 3
i2: 11
i2: 12
i2: 13
*/
// 使用标记
fmt.Println("---- continue label ----")
re:
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue re
}
}
/* output
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
*/
- goto
goto语句主要是无条件转移到过程中指定的行。goto语句通常和条件语句配合使用,可用来实现条件转移、构成循环以及跳出循环体等功能。但是并不主张使用goto语句,以免造成程序流程混乱。 示例代码如下:
var a int = 0
LOOP: for a<5 {
if a == 2 {
a = a+1
goto LOOP
}
fmt.Printf("%d\n", a)
a++
}
/*
output:
0
1
2
3
4
*/
以上代码中的LOOP就是一个标签,当运行到goto语句的时候,此时执行流就会跳转到LOOP标志的哪一行上。
3.3 关键字
go中的关键字如下:
关键字:用法
import:导入相应的包文件
package: 创建包文件,用于标记该文件归属哪个包
chan: channal,通道
var: 变量控制,用于简短声明定义变量(:=符号只能在函数内部使用,不能全局使用)
const: 常量声明,任何时候const和var都可以同时出现
func: 定义函数和方法
interface: 接口,是一种具有一组方法的类型,这些方法定义了interface的行为
map: 哈希表
struct: 定义结构体
type: 声明类型,取别名
for: for是go中唯一的循环结构,上文中已经介绍过它的用法
break:中止,跳出循环
continue: 继续下一轮循环
select: 选择流程,可以同时等待多个通道操作
switch: 多分枝选择,上文中已经详细介绍过它的用法
case: 和switch配套使用
default: 用于选择结构的默认选型
defer: 用于资源释放,会在函数返回之前进行调用
if: 分支选择
else: 和if配套使用
go: 通过go func()来开启一个goroutine
goto: 跳转至标志点的代码块,不推荐使用
range: 用于遍历slice类型数据
return: 用于标注函数返回值
fallthrouth