zoukankan      html  css  js  c++  java
  • Go 语言基础之流程控制

    Go 中的流程控制主要有if elseforfor rangeswitch

    if else 条件判断

    与大多数语言中的 if else 类似,它的结构如下:

    if 表达式1 {
        分支1
    } else if 表达式2 {
        分支2
    } else{
        分支3
    }
    

    不同之处在于,它的表达式部分不需要用 () 包住。例子:

    package main
    
    import "fmt"
    
    func main() {
    	score := 65
    	if score >= 90 {
    		fmt.Println("A")
    	} else if score >= 80 {
    		fmt.Println("B")
    	} else {
    		fmt.Println("C")
    	}
    }
    

    还有需要注意的是,它的起始花括号必须紧跟表达式后面,不可以另起一行,像这样就是错的:

    func main() {
    	score := 65
    	if score >= 90 
    	{                                  // 起始 { 不可以单独一行,需要紧跟表达式后面
    		fmt.Println("A")
    	}
    }
    

    除此之外, if 条件判断还有一个特殊写法:

    func main() {
    	if score := 65; score >= 90 {
    		fmt.Println("A")
    	} else if score >= 80 {
    		fmt.Println("B")
    	} else {
    		fmt.Println("C")
    	}
    
            fmt.Println(score) // error,获取不到score
    }
    

    此种写法将变量赋值放到 if 表达式中,此时变量 score 是一个局部变量,在 if 之外是获取不到的。

    for 循环

    Go 中的 for 循环与大多数语言也类似,结构:

    for 初始语句;条件表达式;结束语句{
        循环体语句
    }
    

    它与 if else 一样,一是表达式不用 () 来包住;二是起始 { 要紧跟在语句后面,不可以另起一行。

    例子:

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

    for 循环的初始语句可以忽略,但初始语句后面的 ; 必须写:

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

    例子中变量 i 的初始化拿到 for 循环的外面实现了,for 循环依旧可以执行。

    不仅仅初始语句可以忽略,结束语句也可以忽略,如下:

    func main() {
    	i := 0
    	for i < 10 {
    		fmt.Println(i)
    		i++
    	}
    }
    

    例子中,for 循环语句只保留了条件表达式,初始语句和结束语句都被拆出来实现,for 循环正常执行。

    switch case

    Go 中 switch case 与多数语言中的也类似,用法也是大同小异。

    基本用法:

    func main() {
        week:=3
        switch week {
        case 0:
            fmt.Println("周日")
        case 1:
            fmt.Println("周一")
        case 2:
            fmt.Println("周二")
        case 3:
            fmt.Println("周三")
        case 4:
            fmt.Println("周四")
        case 5:
            fmt.Println("周五")
        default:
            fmt.Println("周六")
        }
    }
    

    注意每个 switch 只能有一个 default。

    一个分支可以有多个值,多个case值中间使用英文逗号分隔:

    func main() {
        num:=1
        switch num {
        case 1,3,5,7,9:
            fmt.Println("这是奇数")
        case 2,4,6,8,0:
            fmt.Println("这是偶数")
        default:
            fmt.Println(num)
        }
    }
    

    也可以把赋值放在switch里:

    func main() {
        switch num:=1; num {
        case 1,3,5,7,9:
            fmt.Println("这是奇数")
        case 2,4,6,8,0:
            fmt.Println("这是偶数")
        default:
            fmt.Println(num)
        }
    }
    

    分支还可以使用表达式,这时候switch语句后面不需要再跟判断变量。例如:

    func main() {
        score:=90
        switch  {
        case score>=90:
            fmt.Println("优秀")
        case score>=80:
            fmt.Println("良好")
        case score>=60:
            fmt.Println("及格")
        }
    }
    

    fallthrough 可以执行满足条件的 case 的下一个 case:

    func main() {
        b:=true
        switch b {
        case true:
            fmt.Println(1)
            fallthrough
        case false:
            fmt.Println(2)
        }
    }
    

    如上,不加 fallthrough 只打印 1,加上 fallthrough 打印 1 和 2。

    for range

    Go 语言中的 for range 是一个强大的功能,它可以遍历数组,切片,字符串,map 和 通道(channel)。各自遍历出的结果是:

    1. 数组,切片和字符串遍历返回索引和值
    2. map 返回键和值
    3. 通道只返回通道内的值

    这些在后面遇到具体类型时会一一介绍,这里就略过了。

    结尾

    本节主要介绍了 Go 中的流程控制,与大多数语言中用到的基本大同小异,个别差异注意一下就可以。

    如有错误,欢迎指出。

  • 相关阅读:
    EF-CodeFirst-3搞事
    EF-CodeFirst-1 玩起来
    EF-CodeFirst-2玩的嗨
    Asp.Net SignalR Hub类中的操作详解
    Asp.Net SignalR GlobalHost外部通知
    Asp.Net SignalR 多平台的Client与Server
    Asp.Net SignalR 集群会遇到的问题
    常用数学符号读法大全
    关于神经网络拟合任意函数的讨论
    Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
  • 原文地址:https://www.cnblogs.com/wjaaron/p/14832205.html
Copyright © 2011-2022 走看看