go语言基础二(流程控制语句)|青训营

105 阅读2分钟

for 语句

go 中的 for 语法与c/c++、java等语言非常相似,如下

for 简短声明语句;条件表达式;后置语句{

}

例子如下:

for i := 0 ; i < 10 ; i++{
    //里面的语句会执行十次
}

其中i := 0为简短声明语句,i < 10为条件表达式,i++为后置语句。

for 中只有条件表达式必须要有,其他都可以不写,如下:

for ; true; {
    break;
} 

while循环

go 中没有 while 关键字, while 相关的功能被 for 代替了

n := 1
for n< 10 {
    n++
}

go 中如果你希望创建一个无限循环,可以这样写:

for{
    ...
}

if

go 中的if 与其他语言非常相似

if 条件表达式{

} else{
    
}

go 中的 if 同样还支持简短声明语句,并像 for 一样使用它,如下:

if v := time.now().Unix(); v < dtl {
    return v
} else {
    fmt.Println("%#v", v)
}

不过,同样的,当 if-else 语句结束后,简短声明语句声明的变量也无法再使用

switch

在以往的语言中, switch 语句由于自身限制不经常使用, 而在 go 中, switch 则有了非常大的提升,使得它更像 if-else 语句的简便写法。

改动的两个主要方面是:每个 case 自动带有 break ,不需要再自己添加; case 判断的条件被扩展为一个条件表达式的返回值。具体如下:

switch i {
    case 0:
    case func():
}

这是普通的 switch 用法 就是当 i == 0 时执行第一个case,当 i == func() 时执行第二个语句。

而 switch 也同样可以不加条件,此时相当于 if-else ,如下:

var v = 1
switch {//这里没加
case v < 10 :
    fmt.Println("1")
case v <= 17 :
    fmt.Println("2")
default :
    return    
}

defer

defer 是一个新的概念,用来推迟某个函数的执行,如下:

func main() {
    defer fmt.Println("world")
    fmt.Println("hello")
}

这段代码的结果会是这样的:

hello
world

实际上这里 defer 的作用是将fmt.Println("world")推迟到 main 函数结束以后再运行。

那么如果我一次性 defer 了好几个函数,他们执行的先后顺序是什么样的。

func main() {
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
    defer fmt.Println("4")
    fmt.Println("hello")
}

输出结果:

hello
4
3
2
1

也就是先被 defer 的函数后执行,如果你学过数据结构与算法,你也能很容易知道 defer 的背后是一个栈。