• Golang学习笔记——control_structure


    #程序控制结构
    虽然剧透可耻,但是为了体现Go语言的设计简洁之处,必须要先剧透一下。

    Go语言的控制结构关键字只有

    `if..else if..else`,`for` 和 `switch`。

    而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定。看下下面的例子。

    请比较一下A程序和B程序的不同之处。

    **A程序**

    1     package main
    2 
    3     import (
    4         "fmt"
    5     )
    6 
    7     func main() {
    8         fmt.Println("hello world")
    9     }

    **B程序**

     1     package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() 
     8     {
     9         fmt.Println("hello world")
    10     }

    还记得我们前面的例子中,`{}`的格式是怎么样的么?在上面的两个例子中只有A例的写法是对的。因为在Go语言中,强制了`{}`的格式。如果我们试图去编译B程序,那么会发生如下的错误提示。

    ./test_format.go:9: syntax error: unexpected semicolon or newline before {

    **if..else if..else**

    if..else if..else 用来判断一个或者多个条件,然后根据条件的结果执行不同的程序块。举个简单的例子。

     1 package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         var dog_age = 10
     9 
    10         if dog_age > 10 {
    11             fmt.Println("A big dog")
    12         } else if dog_age > 1 && dog_age <= 10 {
    13             fmt.Println("A small dog")
    14         } else {
    15             fmt.Println("A baby dog")
    16         }
    17     }

    上面的例子判断狗狗的年龄如果`(if)`大于10就是一个大狗;否则判断`(else if)`狗狗的年龄是否小于等于10且大于1,这个时候狗狗是小狗狗。否则`(else)`的话(就是默认狗狗的年龄小于等于1岁),那么狗狗是Baby狗狗。

    在上面的例子中,我们还可以发现Go的if..else if..else语句的判断条件一般都不需要使用`()`。当然如果你还是愿意写,也是对的。另外如果为了将某两个或多个条件绑定在一起判断的话,还是需要括号`()`的。

    比如下面的例子也是对的。

     1     package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         const Male = 'M'
     9         const Female = 'F'
    10 
    11         var dog_age = 10
    12         var dog_sex = 'M'
    13 
    14         if (dog_age == 10 && dog_sex == 'M') {
    15             fmt.Println("dog")
    16         }
    17     }

    但是如果你使用Go提供的格式化工具来格式化这段代码的话,Go会智能判断你的括号是否必须有,否则的话,会帮你去掉的。你可以试试。

    go fmt test_bracket.go


    然后你会发现,咦?!果真被去掉了。

    另外因为每个判断条件的结果要么是true要么是false,所以可以使用`&&`,`||`来连接不同的条件。使用`!`来对一个条件取反。

    **switch**

    switch的出现是为了解决某些情况下使用if判断语句带来的繁琐之处。

    例如下面的例子:

     1 package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         //score 为 [0,100]之间的整数
     9         var score int = 69
    10 
    11         if score >= 90 && score <= 100 {
    12             fmt.Println("优秀")
    13         } else if score >= 80 && score < 90 {
    14             fmt.Println("良好")
    15         } else if score >= 70 && score < 80 {
    16             fmt.Println("一般")
    17         } else if score >= 60 && score < 70 {
    18             fmt.Println("及格")
    19         } else {
    20             fmt.Println("不及格")
    21         }
    22     }

    在上面的例子中,我们用if..else if..else来对分数进行分类。这个只是一般的情况下if判断条件的数量。如果if..else if..else的条件太多的话,我们可以使用switch来优化程序。比如上面的程序我们还可以这样写:

     1 package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         //score 为 [0,100]之间的整数
     9         var score int = 69
    10 
    11         switch score / 10 {
    12         case 10:
    13         case 9:
    14             fmt.Println("优秀")
    15         case 8:
    16             fmt.Println("良好")
    17         case 7:
    18             fmt.Println("一般")
    19         case 6:
    20             fmt.Println("及格")
    21         default:
    22             fmt.Println("不及格")
    23         }
    24     }

    关于switch的几点说明如下:

    (1) switch的判断条件可以为任何数据类型。

     1 package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         var dog_sex = "F"
     9         switch dog_sex {
    10         case "M":
    11             fmt.Println("A male dog")
    12         case "F":
    13             fmt.Println("A female dog")
    14         }
    15     }

    (2) 每个case后面跟的是一个完整的程序块,该程序块`不需要{}`,也`不需要break结尾`,因为每个case都是独立的。

    (3) 可以为switch提供一个默认选项default,在上面所有的case都没有满足的情况下,默认执行default后面的语句。


    **for**

    for用在Go语言的循环条件里面。比如说要你输出1...100之间的自然数。最笨的方法就是直接这样。

     1 package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         fmt.Println(1)
     9         fmt.Println(2)
    10         ...
    11         fmt.Println(100)
    12     }

    这个不由地让我想起一个笑话。
    >以前一个地主的儿子学习写字,只学了三天就把老师赶走了。因为在这三天里面他学写了一,二,三。他觉得写字真的太简单了,不就是画横线嘛。于是有一天老爹过寿,让他来记送礼的人名单。直到中午还没有记完,老爹很奇怪就去问他怎么了。他哭着说,“不知道这个人有什么毛病,姓什么不好,姓万”。

    哈哈,回来继续。我们看到上面的例子也是如地主的儿子那样就不好了。所以,我们必须使用循环结构。我们用for的循环语句来实现上面的例子。

     1     package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         var i int = 1
     9 
    10         for ; i <= 100; i++ {
    11             fmt.Println(i)
    12         }
    13     }

    在上面的例子中,首先初始化变量i为1,然后在for循环里面判断是否小于等于100,如果是的话,输出i,然后再使用i++来将i的值自增1。上面的例子,还有一个更好的写法,就是将i的定义和初始化也放在for里面。如下:

     1     package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         for i := 1; i <= 100; i++ {
     9             fmt.Println(i)
    10         }
    11     }

    在Go里面没有提供while关键字,如果你怀念while的写法也可以这样:

     1     package main
     2 
     3     import (
     4         "fmt"
     5     )
     6 
     7     func main() {
     8         var i int = 1
     9 
    10         for i <= 100 {
    11             fmt.Println(i)
    12             i++
    13         }
    14     }

    或许你会问,如果我要死循环呢?是不是`for true`?呵呵,不用了,直接这样。

    1 for{
    2         ...
    3     }

    以上就是Go提供的全部控制流程了。

    再复习一下,Go只提供了:

     1 **if**
     2 
     3     if ...{
     4         ...
     5     }else if ...{
     6         ...
     7     }else{
     8         ...
     9     }
    10     
    11 **switch**
    12     
    13     switch(...){
    14     case ...:
    15              ...
    16     case ...:
    17              ...
    18     ...
    19     
    20     default:
    21               ...
    22     }
    23     
    24 **for**
    25     
    26     for ...; ...; ...{
    27         ...
    28     }
    29     
    30     for ...{
    31         ...
    32     }
    33     
    34     for{
    35         ...
    36     }
  • 相关阅读:
    LeetCode 728. Self Dividing Numbers
    LeetCode 400. Nth Digit
    LeetCode 326. Power of Three
    LeetCode 263. Ugly Number
    LeetCode 258. Add Digits
    详解 CSS 属性
    tr:hover变色的问题
    Java包(package)的命名规范
    javascript中的后退和刷新
    cannot be resolved to a type 错误解决方法
  • 原文地址:https://www.cnblogs.com/cuibin/p/6724651.html
Copyright © 2020-2023  润新知