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

    一、if else语句

    1.1 基本语法1

    语法1

    if condition {
    //do something
    }

    语法2:

    if condition {
    //do something
    } else {
    //do something
    }

    语法3

    if condition {
    //do something
    } else if condition {
    //do something
    } else {
    //do something

    1.2 练习1

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        num := 10
        if num%2 == 0 {
            fmt.Println("the number is even")
        } else {
            fmt.Println("the number is odd")
        }
    }

     执行结果如下:

    1.3 基本语法2

    if statement(语句); condition {
    }

    1.4 练习2

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        if num := 10;num%2 == 0 {
            fmt.Println("the number is even")
        } else {
            fmt.Println("the number is odd")
        }
    }

     执行结果如下:

    1.5 练习3

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        num := 99
        if num <= 50 {
            fmt.Println("number is less than or equal to 50")
        } else if num >= 51 && num <= 100 {
            fmt.Println("number is between 51 and 100")
        } else {
            fmt.Println("number is greater than 100")
        }
    }

     执行结果如下:

    二、 循环

    2.1 Go语言中只有一种循环,就是for循环

    基本语法:

    for initialisation(初始化变量); condition(条件判断); post(变量修改) {
    }

    2.1 练习1

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for i := 1; i <= 10; i++ {
            fmt.Printf("%d", i)
        }
    }

     执行结果如下:

    2.3 break,终止循环

    一句话说:break就是终止本层的循环

    2.4 练习2(break)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for i := 1; i <= 10; i++ {
            if i > 5 {
                break //loop is terminated if i > 5
            }
            fmt.Printf("%d ", i)
        }
        fmt.Printf("
    line after for loop")
    }

    执行结果如下:

    2.5 continue,终止本次循环

    一句话,continue是终止此次循环(跳过本次)。

    2.6 练习3(continue)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for i := 1; i <= 10; i++ {
            if i%2 == 0 {
                continue
            }
            fmt.Printf("%d ", i)
        }
    }

     执行结果如下:

    2.7 练习4

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        i := 0
        for ;i <= 10; { // 初始化变量和变量修改也可以在这一行忽略,将初始化变量写到for循环外,变量修改写到for循环外,";"可以省略也可以写上
            fmt.Printf("%d ", i)
            i += 2
        }
    }

     执行结果如下:

    2.8 练习5

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 {
            fmt.Printf("%d * %d = %d
    ", no, i, no*i)
        }
    } 

    执行结果如下:

    2.9 无限循环

    就是for循环不写任何条件

    2.10 练习6(无限循环)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for {  //for循环不加任何条件即为无限循环
            fmt.Printf("hello")
        }
    }

    执行结果如下:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        for {  //for循环不加任何条件即为无限循环
            fmt.Printf("hello")
        }
    }

     执行结果如下:

    尴尬的是:vscode也跑挂了。

    三、 switch语句

    3.1 switch语句语法

    switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。。

    switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break

    基本语法是:

    switch var1 {
      case val1:
        ...
      case val2:
        ...
      default:
        ...
    }

     解释:

    变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。也可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。default是默认值,可以写也可以不写。

    switch语句流程图如下:

    3.2 练习1(不加default)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        finger := 4
        switch finger {
        case 1:
            fmt.Println("Thumb")    //此处写多行语句也可以
        case 2:
            fmt.Println("Index")
        case 3:
            fmt.Println("Middle")
        case 4:
            fmt.Println("Ring")
        case 5:
            fmt.Println("Pinky")
        }
    }

     执行结果如下:

    3.3 练习2(switch default)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        switch finger := 8; finger {
        case 1:
            fmt.Println("Thumb")
        case 2:
            fmt.Println("Index")
        case 3:
            fmt.Println("Middle")
        case 4:
            fmt.Println("Ring")
        case 5:
            fmt.Println("Pinky")
        default: //default case,当上述case选项都不符合时,执行这里语句
            fmt.Println("incorrect finger number")
        }
    }

     执行结果如下:

    3.4 练习3(case值为多个条件)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        letter := "i"
        switch letter {
        case "a", "e", "i", "o", "u":
            fmt.Println("vowel")
        default:
            fmt.Println("not a vowel")
        }
    }

     执行结果如下:

    3.5 练习4(case条件判断)

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        num := 75
        switch { // expression is omitted(表达式省略掉了)
        case num >= 0 && num <= 50:
            fmt.Println("num is greater than 0 and less than 50")
        case num >= 51 && num <= 100:
            fmt.Println("num is greater than 51 and less than 100")
        case num >= 101:
            fmt.Println("num is greater than 100")
        }
    }

     执行结果如下:

    3.6 练习4(fallthrough)

    switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break,如果case1已经满足条件了,但是还想执行case2的话,我们可以通过使用fallthrough关键字,同理如果还想继续执行case3的话,那我们可以接着使用fallthrough

    实例如下:

    package main
    
    import (
        "fmt"
    )
    
    func number() int {
        num := 15 * 5
        return num
    }
    func main() {
        switch num := number(); { //num is not a constant
        case num < 50:
            fmt.Printf("%d is lesser than 50
    ", num)
            fallthrough
        case num < 100:
            fmt.Printf("%d is lesser than 100
    ", num)
            fallthrough
        case num < 200:
            fmt.Printf("%d is lesser than 200", num)
        }
    }

    执行结果如下:

    四、 练习题

    生成一个随机数,让一个用户去猜这个数是多少?

    代码示例如下:

    package main
    
    import (
        "fmt"
        "math/rand" //math包中的rand函数可以用来生成随机数
        "time"
    )
    
    func main() {
        var number int
        /*
            for i := 0;i < 10; i++ {
                number = rand.Intn(100)
                fmt.Printf("number:%d
    ",number)
            }
            因为伪随机的存在,rand生成的随机数都有一个固定的序列,比如第一次生成1,第二次生成20等等,随机数的序列是固定,我们可以通过给其一个随机的总值,如果随机的总值不一样,那么伪随机数的序列也不一样。我们不给,他就是按照一个默认的随机总值,所以伪随机数序列永远是一样的。
        */
        rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设置总值,这里我们以当前时间来设置总值,并且用的纳秒,十分精确了
        number = rand.Intn(100)          //随机数的范围是0-100,但不包括100
        fmt.Printf("请猜一个数字,数字的范围是:[0-100)
    ")
        for { //因为并不知道用户什么时候输入正确,所以是没有限制条件的,我们只能做一个死循环,配合switch语句满足条件了即可退出;
            var input int
            fmt.Scanf("%d
    ", &input) //Scanf表示让用户输入,Scanf从终端读取一个整数,并传值给input变量,&表示获取到该变量内存地址
            var flag bool = false     //通过设置flag变量,解决的是用户输入正确后可以退出
            switch {
            case number > input:
                fmt.Printf("您输入的数字太小
    ")
            case number == input:
                fmt.Printf("恭喜您,答对了!
    ")
                flag = true
            case number < input:
                fmt.Printf("您输入的数字太大
    ")
            }
            if flag { //表示如果flag为真,则break退出这个for循环
                break
            }
        }
    } 

    执行结果如下:

     

    补充:

    Scanf哪里一定要加上 ,因为加上的话就已经表示以回车换行符为止,这样就已经保证了能够获取到用户输入的真正的数字,你如果不加 ,他就不行了,就会识别2次一个是你输入的数字,一个是回车。

    4.2 补充1:

    为什么等待用户输入的变量要加上&符号?

    答:

    如果我们去掉&,不传入地址的话,我们是修改不了input的变量的值,假如我传入一个test值进去,因为数据类型时int,其也就是值类型,这一次传值,其内部就相当于拷贝了一份,这一份我们就可以称其为b1,我们修改的仅仅是b1的值,并不是外面input变量的值,input变量的值并没有修改。

    4.3 补充2:

    针对Go语言中基本数据类型是值类型的实例:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var a int = 100
        var b int
        b = a
        b = 200
        fmt.Printf("a=%d,b=%d, a=%p, b=%p", a, b, &a, &b)
    }

     执行结果:

    解释:

    变量a赋值100,变量b暂未赋值,然后将a变量复制给b,此时b为100,下面又重新为b变量赋值200,最终输出结果a为100,b为200。因为a和b都是值类型,所以a和b的内存地址都是相互独立的,如果不是独立的,那么当b重新赋值为200时,a也应该是200了,但是a为100,也充分证明了,a和b的内存地址是相互独立的。

    4.4 补充3

    1)Go语言中的基本数据类型都是值类型。

         值类型:定义一个变量a,在定义一个变量b,将 a=b(b赋值给a),对于值类型来说,此时虽然b赋值给a了,但是a和b依然是两块独立的内存地址

    2)我们都知道设置变量是为了我们去方便操作内存,在底层其都是一个个内存地址,我们cpu寻址的话,都是通过内存地址去寻址的,打印出来的内存地址都是16进制的串。比如说变量a=100,在计算机内部,      我们是通过内存地址找到那块内存,然后那块内存是int类型,其占4个字节,找到那块内存,找到那4个字节,然后把100存进去就可以了,go语言就是这样比较原始。

  • 相关阅读:
    请允许我们发个广告——与云共舞:以华为云精英服务商为起点开展我们的云业务团队
    【故障公告】再次出现数据库 CPU 居高不下的问题以及找到了最可能的原因团队
    【故障公告】升级阿里云 RDS SQL Server 实例故障经过团队
    【故障公告】阿里云 RDS 数据库服务器 CPU 100% 造成全站故障团队
    全网最详细的Sublime Text 3的激活(图文详解)
    全网最详细的Windows里下载与安装Sublime Text *(图文详解)
    全网最详细的大数据集群环境下多个不同版本的Cloudera Hue之间的界面对比(图文详解)
    全网最详细的Cloudera Hue执行./build/env/bin/supervisor 时出现KeyError: "Couldn't get user id for user hue"的解决办法(图文详解)
    全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)
    Hive执行过程中出现Caused by : java.lang.ClassNotFoundException: org.cloudera.htrace.Trace的错误解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/forever521Lee/p/9298871.html
Copyright © 2011-2022 走看看