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形式

key,value形式,value始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值(译者注:如果 val 为指针,则会产生指针的拷贝,依旧可以修改集合中的原值)

一个字符串是 Unicode 编码的字符(或称之为 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
}
 


posted @ 2019-09-08 22:52  DreamAgain~  阅读(292)  评论(0)    收藏  举报