一.分支结构

也就是 if else ,和 .Net 的语法一样(多了强制规范规则)

if condition1 {
    // do something
} else if condition2 {
    // do something else
}else {
    // catch-all or default
}

关键字 if 和 else 之后的左大括号 { 必须和关键字在同一行,如果你使用了 else if 结构,则前段代码块的右大括号 } 必须和 else if 关键字在同一行,这两条规则都是被编译器强制规定的。

 

特殊写法:

if 还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断,代码如下:

if err := Connect(); err != nil {
    fmt.Println(err)
    return
}

Connect 是一个带有返回值的函数,err:=Connect() 是一个语句,执行 Connect 后,将错误保存到 err 变量中。

err != nil 才是 if 的判断表达式,当 err 不为空时,打印错误并返回。

这种写法可以将返回值与判断放在一行进行处理,而且返回值的作用范围被限制在 if、else 语句组合中。

 

二.循环结构

也就是 for 循环,不过写法略多

基础写法:

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

简化写法,并可很好支持无限循环,不需要用其他语言 while 等的写法:

sum := 0
for {
    sum++
    if sum > 100 {
        break
    }
}

使用循环语句时,需要注意 左花括号 { 必须与 for 处于同一行

 

Go语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环,如下例:

for j := 0; j < 5; j++ {
    for i := 0; i < 10; i++ { if i > 5 {
            break JLoop
        }
        fmt.Println(i)
    }
}
JLoop:
// ...

 

 

三.键值循环 for range

for range 可以遍历数组、切片、字符串、map 及通道(channel),for range 语法上类似于其它语言中的 foreach 语句,一般形式为:

for key, val := range coll {
    ...
}

 

1.遍历字符串——获得字符
key 和 value 分别代表字符串的索引和字符串中的每一个字符

for key, value := range []int{1, 2, 3, 4} {
    fmt.Printf("key:%d  value:%d\n", key, value)
}

 

2.遍历 map——获得 map 的键和值
key 和 value 分别代表 map 的索引键 key 和索引对应的值

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for key, value := range m {
    fmt.Println(key, value)
}

 

3.遍历通道(channel)——接收通道数据
通道在遍历时,只输出一个值,即管道内的类型对应的数据

c := make(chan int)
go func() {
    c <- 1
    c <- 2
    c <- 3
    close(c)
}()
for v := range c {
    fmt.Println(v)
}

 

需要要注意的是,val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。

 

四.switch case语句

Go语言改进了 switch 的语法设计,case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行

var a = "hello"
switch a {
case "hello":
    fmt.Println(1)
case "world":
    fmt.Println(2)
default:
    fmt.Println(0)
}

 

当出现多个 case 要放在一起的时候,可以写成下面这样

var a = "mum"
switch a {
case "mum", "daddy":
    fmt.Println("family")
}

 

case 后不仅仅只是常量,还可以和 if 一样添加表达式

var r int = 11
switch {
case r > 10 && r < 20:
    fmt.Println(r)
}

 

跨越 case 的 fallthrough,换句话来说,添加关键字后,会继续执行下面符合条件的 case

var s = "hello"
switch {
case s == "hello":
    fmt.Println("hello")
    fallthrough
case s != "world":
    fmt.Println("world")
}

 

 

五.goto语句——跳转到指定的标签

Go语言中 goto 语句通过标签进行代码间的无条件跳转,同时 goto 语句在快速跳出循环、避免重复退出上也有一定的帮助,使用 goto 语句能简化一些代码的实现过程。

  err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()

可以看出,goto 对应的标签可以看成是一个函数体

 

六.continue语句(继续下一次循环)

Go语言中 continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用,在 continue 语句后添加标签时,表示开始标签对应的循环,例如:

package main
import "fmt"
func main() {
OuterLoop:
    for i := 0; i < 2; i++ {
        for j := 0; j < 5; j++ {
            switch j {
            case 2:
                fmt.Println(i, j)
                continue OuterLoop
            }
        }
    }
}