一、条件语句

if…else

  1. var a int = 10
  2. if a < 0 {
  3. fmt.Printf("a < 0" )
  4. } else if a > 0 {
  5. fmt.Printf("a > 0" )
  6. } else {
  7. fmt.Println("a == 0")
  8. }

switch

go的switch语句不需要添加break

  var grade string
  var marks int = 90

  switch marks {
    case 90: grade = "A"
    case 80: grade = "B"
    case 50,60,70 : grade = "C"
    default: grade = "D"
  }

  switch {
    case grade == "A":
      fmt.Printf("优秀!\n" )
    case grade == "B", grade == "C":
      fmt.Printf("良好\n" )
    case grade == "D":
      fmt.Printf("及格\n" )
    case grade == "F":
      fmt.Printf("不及格\n" )
    default:
      fmt.Printf("差\n" )
  }
  fmt.Printf("你的等级是 %s\n", grade )

Type Switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
Type Switch 语法格式如下:

switch x.(type){
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}

示例:

  var x interface{}

  switch i := x.(type) {
    case nil:
      fmt.Printf(" x 的类型 :%T",i)
    case int:
      fmt.Printf("x 是 int 型")
    case float64:
      fmt.Printf("x 是 float64 型")
    case func(int) float64:
      fmt.Printf("x 是 func(int) 型")
    case bool, string:
      fmt.Printf("x 是 bool 或 string 型" )
    default:
      fmt.Printf("未知型")
  }

输出:

 x 的类型 :<nil>

fallthrough

使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
示例:

  var num = 50
  switch {
    case num > 10:
      fmt.Println("num > 10")
      fallthrough
    case num > 50:
      fmt.Println("num > 50")
      fallthrough
    default:
      fmt.Println("num <= 10")
  }

输出:

num > 10
num > 50
num <= 10

可以看到,本来只需要执行第一个条件,但是由于加上了 fallthrough ,之后的两个语句也执行了。

select

详见:
语雀内容

二、循环语句

for

循环数字

sum := 0
for i := 0; i <= 10; i++ {
    sum += i
}
fmt.Println(sum)

循环数组

通过 range 来遍历数组

list := [...]int{1,2,3}
for k, v := range list {
    fmt.Println(k, v)
}

如果指定了数组长度,而初始化时并未完全填充,则未填充的值为零值

numbers := [6]int{1, 2, 3, 4}
for i, x:= range numbers {
    fmt.Printf("第 %d 位 x 的值 = %d\n", i, x)
}

打印:

第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 4
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0

循环Map

oldMap := map[int]string{1: "a", 2: "b"}
newMap := map[interface{}]interface{}{}
for key, value := range oldMap {
    newMap[key] = value
}
fmt.Println(newMap) // map[1:a 2:b]

类while循环

在go中没有while荀凡,可以用for代替:

sum := 1
for ; sum <= 10; {
    sum += sum
}
fmt.Println(sum)
for sum <= 10{
    sum += sum
}
fmt.Println(sum)

无限循环

for {
    fmt.Println("done")
}
for true{
    fmt.Println("done")
}

循环控制语句

循环控制语句包括:

  • break
  • continue
  • goto

breakcontinue 不多说,重点说一下 goto
每一个语句都能对其添加标签,goto用于跳到指定标签处。

/* 定义局部变量 */
var a int = 10

/* 循环 */
LOOP: for a < 20 {
    if a > 12 && a < 18 {
        /* 跳过迭代 */
        a = a + 1
        goto LOOP
    }
    fmt.Printf("a的值为 : %d\n", a)
    a++
}

打印:

a的值为 : 10
a的值为 : 11
a的值为 : 12
a的值为 : 18
a的值为 : 19

再看一个例子:

/* 定义局部变量 */
var a int = 10

/* 循环 */
for a < 20 {
    if a > 12 {
        /* 跳过迭代 */
        a = a + 1
        goto DONE
    }
    fmt.Printf("a的值为 : %d\n", a)
    a++
}

DONE: fmt.Println("done")

打印:

a的值为 : 10
a的值为 : 11
a的值为 : 12
done