golang 控制结构
此为学习无闻大佬写的golang教程
1.if-else 结构
if condition1 { // do something } else if condition2 { // do something else }else { // catch-all or default }
基本和java一样,只是不用将条件用括号括起来, 但是左括号必须跟在条件后,不能单独一行,java则没有限制。
2.多返回值
这是golang的特性,java中多返回值,我们一般采用,对象或某种集合进行返回,特殊的如pair等。
Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功;返回零值(或 nil)和 false 表示失败。
也可以使用一个 error 类型的变量来代替作为第二个返回值:成功执行的话,error 的值为 nil,否则就会包含相应的错误信息(Go 语言中的错误类型为 error:var err error)。
这样一来,就很明显需要用一个 if 语句来测试执行结果;由于其符号的原因,这样的形式又称之为 comma,ok 模式(pattern)。
f, err := os.Open(name) if err != nil { return err } doSomething(f) // 当没有错误发生时,文件对象被传入到某个函数中 doSomething
3 switch
Go 语言中的 switch 结构使用上更加灵活。它接受任意形式的表达式:
switch var1 { case val1: ... case val2: ... default: ... }变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号{必须和 switch 关键字在同一行。
可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。
每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。( Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止。)
一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说您不需要特别使用break语句来表示结束。
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用fallthrough关键字来达到目的。
switch i {
case 0: fallthrough
case 1:
f() // 当 i == 0 时函数也会被调用
}
4.for循环
基础形式和java一样,只是不需要括号。
for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
还可以在循环中同时使用多个计数器。比较利于快速排序的写法。
for i, j := 0, N; i < j; i, j = i+1, j-1 {}
ASCII 编码的字符占用 1 个字节,既每个索引都指向不同的字符,而非 ASCII 编码的字符(占有 2 到 4 个字节)不能单纯地使用索引来判断是否为同一个字符
基于条件判断的迭代
for i >= 0 {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
}
像while循环,其实只是把条件的变化写到方法体中。
for-range形式一个字符串是 Unicode 编码的字符(或称之为key,value形式,value始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值(译者注:如果val为指针,则会产生指针的拷贝,依旧可以修改集合中的原值)rune)集合,因此您也可以用它迭代字符串:
for pos, char := range str {
...
}
break和continue 和java中用法一致
一个 break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)。但在 switch 或 select 语句中(详见第 13 章),break 语句的作用结果是跳过整个代码块,执行后续的代码。
标签与goto
for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:)结尾的单词。(标签的名称是大小写敏感的,为了提升可读性,一般建议使用全部大写字母)
LABEL1:
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
特别注意 使用标签和 goto 语句是不被鼓励的:它们会很快导致非常糟糕的程序设计,而且总有更加可读的替代方案来实现相同的需求
func main() {
i:=0
HERE:
print(i)
i++
if i==5 {
return
}
goto HERE
}

浙公网安备 33010602011771号