Golang 条件循环语句

前言

本文简单描述 golang 中最常用的两种流程控制语句,条件和循环。在其他编程语言的基础上介绍条件语句 if 和 switch 的语法和 fallthrough 关键字,以及循环语句 for 的三种使用形式和 break/continue 关键字,并粗略介绍了 goto 语句的用法。

条件语句

golang 的条件语句和其他语言大同小异,仅做一些简单介绍即可。

if 语句

if 语句和其他语言相同,使用 if - elseif - else 的格式,需要注意的是 go 的 condition 只能为表达式,如 if res != 0 {},而不能像 python 一样直接使用 if res {}

if condition {
	// dosomething
} else if condition {
    // dosomething
} else {
	// dosomething
}

go 的 if 语句还可以和 ; 结合,成为 if 赋值;判断 {} 的形式,常用于错误处理或者判断 map 元素是否存在等场景,如下:

func f() error {
	// ...
}

if err := f(); err != nil {
	// ...
}
// 等价于
// err := f()
// if err != nil {
// }

// 判断字典元素是否存在
// 判断某个 key n 是否在字典中
// 若存在,ok 为 True,否则为 False
if _, ok := map_name[n]; ok {
    // ...
}

switch 语句

switch 语句执行的过程从上至下,直到找到匹配项

和 C 语言等不同的是,go 的 switch 默认情况下 case 最后自带 break,不需要再显示的加 break。匹配成功后就不会执行其他 case,如果要执行后面的 case,需要使用 fallthrough 关键字。

switch i {
    case 0: // 空的 case 体
    case 1:
        f() // 当i == 0 时,f 不会被调用!
}

switch i {
    case 0: fallthrough
    case 1:
        f() // 当i == 0 时,f 会被调用!
}

switch i {
    case 0, 1, 2:
        f() // 当 i 为 0 或 1 或 2 时,f 会被调用!
}

select 语句

select 为 channel 相关的流程控制语句,会在后面介绍 channel 的时候详细介绍。

for 循环语句

go 的循环只有 for 循环这一种方式,没有其他语言中的 while,do while 等。

第一种形式

go 没有逗号表达式,所以如果要执行多个变量,要用平行赋值
go 中 ++,-- 是语句而不是表达式,所以只能出现 i++,而 j = i++ 这种写法会报错

for initialization; condition; post {
    // dosomething
}

// 不能写为 for i := 0, j := len(a) - 1; i < j; i++, j-- {}
for i, j := 0, len(a) - 1; i < j; i, j = i + 1, j - 1 {
    a[i], a[j] = a[j], a[i]
}

第二种形式

类似其他语言的 while 循环
condition 也可以省略变成无限循环

for condition {
    // dosomething
}

第三种形式

实际开发中最常使用这种形式,用于遍历 array,slice,string, map, channel 等,每次循环迭代, range 产生一对值;索引以及在该索引处的元素值。

类似 python 中的 for i, num in enumerate(nums)

for i, num := range nums {
    // dosomething
}

// 如果不需要用到索引,则必须用 _ 空标识符(blank identifier)代替索引变量,因为Go语言不允许使用无用的局部变量(local variables,会导致编译错误
for _, num := range nums {
    // dosomething
}

break / continue

go 的循环语句可以使用 break 和 continue 来控制循环,使用方式和其他语言一样,使用 break 来中断循环,使用 continue 跳过本次循环进行下一次循环,此处不做赘述。

比较有特色的是,go 的 break 可以指定跳出的标签,如下, 如果直接用 break,则跳出 j 循环,进入 i 循环,但是在 i 层添加了 tag,并且 break 到 tag 处,则直接跳出 i 循环。

LOOP:
for i < 10 {
	for j < 10 {
		j++
		if j = 5 {
			break LOOP
		}
	}
}

goto 跳转语句

Go 语言的 goto 语句可以无条件地转移到过程中指定的行,通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

var a int = 10
 
LOOP: for a < 20 {   // 设置标签
   if a == 15 {
      /* 跳过迭代 */
      a = a + 1
      goto LOOP  // 跳到标签 “LOOP” 的位置
   }
   fmt.Printf("a的值为 : %d\n", a)
   a++    
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值