Go 编程基础 控制语句 05

for 循环

go中循环只有for 并没有 while 但是他有3中形式的for循环

没有条件的for循环

这种循环,如果你再for循环内 不break的话.. 就一直在循环.. 程序假死状态

func main() {
    a := 1
    for {
        a++
        if a > 3{
            break
        }
        fmt.Println(a)
    }
    fmt.Println("over")
}
2
3
over

有一个条件的for循环

func main() {
    a := 1
    for a<= 3{
        a++
        fmt.Println(a)
    }
    fmt.Println("over")
}
2
3
4
over

三个条件,步进式循环

这种是最经典的for循环了吧

func main() {
    for i := 0; i < 3; i++ {
        fmt.Println(i)
    }
    fmt.Println("over")
}
0
1
2
over

switch语句

  • 可以使用任何类型或者表达式作为条件语句
  • 不需要写break 一旦条件符合自动终止
  • 入希望继续执行下一个case,需使用fallthrough语句
  • 支持一个初始化表达式(可以是并行方法) ,右侧需跟分号
  • 左大括号必须和条件语句在同一行

switch经典用法

func main() {
    a := 1
    switch a {
    case 0:
        fmt.Println("a=0")
    case 1:
        fmt.Println("a=1")
    default:
        fmt.Println("none")
    }
}
a=1

switch case 条件表达式

如果case后面为 true 那么就执行代码,否则进入下一个匹配

func main() {
    a := 1
    switch {
    case a >= 0:
        fmt.Println("a>=0")
    case a >= 1:
        fmt.Println("a>=1")
    default:
        fmt.Println("none")
    }
}
a>=0

这时候.. 我们看到a=1 其实也是大于等于1的但是,并没有执行代码... 上面说了 go只要匹配到一个就会退出 除非自己手动调用fallthrough 这样会继续往下匹配

fallthrough 改版

func main() {
    a := 1
    switch {
    case a >= 0:
        fmt.Println("a>=0")
        fallthrough
    case a >= 1:
        fmt.Println("a>=1")
    default:
        fmt.Println("none")
    }
}
a>=0
a>=1

初始化值的switch

func main() {
    switch  a := 1; {
    case a >= 0:
        fmt.Println("a>=0")
        fallthrough
    case a >= 1:
        fmt.Println("a>=1")
    default:
        fmt.Println("none")
    }
}

注意这a的作用域只是在于swith这个循环里面.是一个局部变量..循环完毕 ..变量销毁

a>=0
a>=1

跳转语句 goto break continue

  • 三个语法都可以配合标签使用
  • 标签名区分大小写,若不使用会造成比编译错误
  • Break 与 continue 配合标签可用于多层循环的跳出
  • Goto是调整执行位置, 与其他2个语句配合标签的结果并不相同

不带LABLE 的 break

这明显是一个无限循环,,因为break只能break掉最内层循环,,然后外层还是一个无限循环 所以这最终还是一个无限循环

func main() {
    for {
        for i := 1; i < 10; i++ {
            fmt.Println(i)
            if i > 3 {
                break
            }
        }
    }
    fmt.Println("ok")
}

带LABLE 的 break

如果满足条件, 会break LABLE同级的循环,这样最外层for就不会执行

func main() {
LABLE:
    for {
        for i := 1; i < 10; i++ {
            fmt.Println(i)
            if i > 3 {
                break LABLE
            }
        }
    }
    fmt.Println("ok")
}
1
2
3
4
ok

goto

goto是改变程序的循环起始位置

下面这段代码还是无限循环.. 因为goto到了和lable同级的for循环..最外层的for依然是个无限循环

func main() {
LABLE:
    for {
        for i := 1; i < 10; i++ {
            fmt.Println(i)
            if i > 3 {
                goto LABLE
            }
        }
    }
    fmt.Println("ok")
}

修改之后goto

这样就goto到lable同级..就直接输出ok了

func main() {
    for {
        for i := 1; i < 10; i++ {
            fmt.Println(i)
            if i > 3 {
                goto LABLE
            }
        }
    }
    LABLE:
    fmt.Println("ok")
}
1
2
3
4
ok

continue

continue是 不执行剩下的循环体.. 直接执行下一次循环

这也是一个无限循环.. 他本身就是个无限循环, 你最后continue还是无限循环

func main() {
LABLE:
    for {
        for i := 1; i < 10; i++ {
            fmt.Println(i)
            if i > 3 {
                continue LABLE
            }
        }
    }
    fmt.Println("ok")
}

所以 continue 是使用在 有限循环嵌套无限循环

func main() {
LABLE:
    for i := 1; i < 10; i++ {
        for {
            continue LABLE
            fmt.Println(i)
        }
    }
    fmt.Println("ok")
}
ok