Go 语言入门指南 (4)| 青训营

58 阅读5分钟

接着上一篇的知识点继续。。

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实现循环的,共有三种形式:

  1. 和c语言中的for相同 for init; condition; post {}
  2. 和c语言中的while相同 for condition{}
  3. 和c语言中的for(;;)相同 for{}

除此以外,for循环还可以直接使用range对slice、map、数组以及字符串等进行迭代循环,格式如下:

for key, value := range oldmap {
	newmap[key] = value
}

3.2.2 循环控制语句

  1. break 中断跳出循环或者switch语句
  2. continue 跳过当前循环的剩余语句,然后继续下一轮循环
  3. 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