Golang

Golang流程控制

流程控制语句作用

  • 选择: 根据条件跳转到不同的执行序列
  • 循环: 根据条件反复执行某个序列
  • 跳转: 据条件返回到某执行序列

流程控制语句类型

  • 条件语句: 关键字为if,elseelse if
  • 选择语句: 关键字为switch,caseselect
  • 循环语句: 关键字为forfor range
  • 跳转语句: 关键字为goto

if-else-if

  • 条件语句不需要使用括号()将条件包含起来
  • 条件语句无论语句体内有几条语句,花括号{}都必须存在
  • 条件语句的左花括号{必须与ifelse同处一行,否则编译器给出错误: syntax error: missing { after if clause
  • 条件语句的else必须和上一个语句体结束的右花括号}同处一行,否则编译器给出错误: syntax error: unexpected else, expecting }
  • 条件语句在if之后可以添加变量初始化语句,但需要使用分号;间隔
package main

import "fmt"

var (
    i int
    j int
    k int
)

func main() {
    fmt.Println("请输入3整数:")
    fmt.Scanln(&i, &j, &k)
    if i > j {
        i, j = j, i
    }
    if i > k {
        i, k = k, i
    }
    if j > k {
        j, k = k, j
    }
    fmt.Println(i, j, k)
}
package main

import (
    "fmt"
)

func main() {
    // yes == "Y" || "y"
    var yes string
    fmt.Println("有卖西瓜的吗?(Y/N) ")
    fmt.Scan(&yes)

    fmt.Println("----------female-----------")
    if yes == "Y" || yes == "y" {
        fmt.Println("一个西瓜")
    }

    fmt.Println("-----------male------------")
    if yes == "Y" || yes == "y" {
        fmt.Println("一个包子")
    } else {
        fmt.Println("是个包子")
    }

    var score int
    fmt.Print("请输入成绩: ")
    fmt.Scan(&score)
    if score >= 90 {
        fmt.Println("A")
    } else if score >= 80 {
        fmt.Println("B")
    } else if score >= 70 {
        fmt.Println("C")
    } else if score >= 60 {
        fmt.Println("D")
    } else {
        fmt.Println("E")
    }
}
package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    const filename = "access.log"
    // contexts, err := ioutil.ReadFile(filename)
    // if err != nil {
    //     fmt.Println(err)
    // } else {
    //     fmt.Printf("%s\n", contexts)
    // }
    if contexts, err := ioutil.ReadFile(filename); err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n", contexts)
    }
}

switch-case

  • 选择语句中,左花括号{必须与switch同处一行
  • 选择语句中,case后可以使用常量,还可以使用变量
  • 选择语句中,单个case后可以出现多个结果选项
  • 选择语句中,不需要用break来明确退出一个case
  • 选择语句中,只有在case中明确添加fallthrough关键字,才会继续执行下一个case
  • 选择语句中,可不设定switch后的条件表达式,在此种情况下整个switch结构与if else的逻辑等同
package main

import (
    "fmt"
)

func main() {
    var yes string
    fmt.Println("有卖西瓜的吗?(Y/N) ")
    fmt.Scan(&yes)

    fmt.Println("----------female-----------")
    switch yes {
    case "Y", "y":
        fmt.Println("一个西瓜")
    }

    fmt.Println("-----------male------------")
    switch yes {
    case "Y", "y":
        fmt.Println("一个包子")
    default:
        fmt.Println("十个包子")
    }

    var score int
    fmt.Println("请输入成绩: ")
    fmt.Scan(&score)
    switch {
    case score >= 90:
        fmt.Println("A")
    case score >= 80:
        fmt.Println("B")
    case score >= 70:
        fmt.Println("C")
    case score >= 60:
        fmt.Println("D")
    default:
        fmt.Println("E")
    }
}
package main

import (
    "fmt"
)

func main() {
    var y, m, d, days int = 0, 0, 0, 0
    fmt.Println("请输入年 月 日")
    fmt.Scanf("%d%d%d\n", &y, &m, &d)
    fmt.Printf("%d年%d月%d日", y, m, d)
    switch m {
    case 12:
        days += d
        d = 30
        fallthrough
    case 11:
        days += d
        d = 31
        fallthrough
    case 10:
        days += d
        d = 30
        fallthrough
    case 9:
        days += d
        d = 31
        fallthrough
    case 8:
        days += d
        d = 31
        fallthrough
    case 7:
        days += d
        d = 30
        fallthrough
    case 6:
        days += d
        d = 31
        fallthrough
    case 5:
        days += d
        d = 30
        fallthrough
    case 4:
        days += d
        d = 31
        fallthrough
    case 3:
        days += d
        d = 28
        if (y%400 == 0) || (y%4 == 0 && y%100 != 0) {
            d += 1
        }
        fallthrough
    case 2:
        days += d
        d = 31
        fallthrough
    case 1:
        days += d
    }
    fmt.Printf("是今年的第%d天!\n", days)
}

for

  • 循环语句只支持for结构,不支持whiledo-while结构
  • 循环语句左花括号{必须与for处于同一行
  • 循环语句不支持以逗号为间隔的多赋值语句,支持使用多元赋值的方式来初始化多个变量
  • 循环语句支持continuebreak来控制循环,但提供了一个更高级的break,可以选择中断哪一层循环
package main

import (
    "fmt"
)

func main() {
    var sum int
    for i := 1; i <= 100; i++ {
        sum += i
    }
    fmt.Println(sum)

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

    sum = 0
    i = 0
    for {
        i++
        sum += i
        if i == 100 {
            break
        }
    }
    fmt.Println(sum)
}
package main

import (
    "fmt"
    "time"
)

var (
    i   int //百位
    j   int //十位
    k   int //个位
    num int
)

func main() {
    t1 := time.Now()
    for num := 100; num < 1000; num++ {
        i = num / 100
        j = num / 10 % 10
        k = num % 10
        if num == (i*i*i + j*j*j + k*k*k) {
            fmt.Println(num)
        }
    }
    fmt.Println(time.Since(t1))
}

break

  • 用于for循环, switch,select语句,终止整个语句块的执行

continue

  • 仅用于for循环内部 ,终止本次循环,立即进入下一轮循环
package main

import (
    "fmt"
)

func main() {
    // 跳出出本轮循环
    fmt.Println("continue:")
    for i := 0; i < 5; i++ {
        if i == 3 {
            continue
        }
        fmt.Println(i)
    }

    // break: 循环直接结束
    fmt.Println("break:")
    for i := 0; i < 5; i++ {
        if i == 3 {
            break
        }
        fmt.Println(i)
    }
}

goto

  • 选择语句的语义非常简单,就是跳转到本函数内的某个标签处执行,但不能跳转到其他函数或内层代码块内
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {

    for {
        rand.Seed(time.Now().Unix())
        num := rand.Int() % 101
        fmt.Println(num)

        for j := 5; j >= 1; j-- {
            var answer int
            fmt.Print("请输入一个0到100的整数: ")
            fmt.Scan(&answer)
            if answer == num {
                fmt.Println("恭喜,猜对了!")
                goto END
            } else if answer > num {
                if j == 1 {
                    fmt.Println("没有猜对,真笨!再来一次吧")
                } else {
                    fmt.Printf("输入的数字太大了,请重新输入,还剩%d次机会\n", j-1)
                }
            } else if answer < num {
                if j == 1 {
                    fmt.Println("没有猜对,真笨!再来一次吧")
                } else {
                    fmt.Printf("输入的数字太小了,请重新输入,还剩%d次机会\n", j-1)
                }
            }
        }
    }
END:
}
微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.