YMLiang

请关注我的个人博客

流程控制

  • if

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       if 布尔表达式 {
    /* 在布尔表达式为 true 时执行 */
    }

    *不支持三元操作符(三目运算符) "a > b ? a : b"。


    if else:

    if 布尔表达式 {
    /* 在布尔表达式为 true 时执行 */
    } else {
    /* 在布尔表达式为 false 时执行 */
    }
  • for

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Go语言的For循环有3中形式,只有其中的一种使用分号。

    for init; condition; post { }
    for condition { }
    for { }
    init: 一般为赋值表达式,给控制变量赋初值;
    condition: 关系表达式或逻辑表达式,循环控制条件;
    post: 一般为赋值表达式,给控制变量增量或减量。
    for语句执行过程如下:
    ①先对表达式 init 赋初值;
    ②判别赋值表达式 init 是否满足给定 condition 条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。

    公式:
    for [condition | ( init; condition; increment ) | Range]
    {
    statement(s)
    }

    替代 while(true)的方法:

    for {

    }



    因为比较简单,我这里说一个稍微复杂一点的就是 range ,那么请先看range的知识点

    下面是一个栗子:
    func changeBigSmallWord(str string) string{
    result := ""
    for i,value := range str{
    if i%2==0 {
    result += strings.ToUpper(string(value))
    }else {
    result += strings.ToLower(string(value))
    }
    }
    return result
    }
    循环时用到range 即迭代传入的 str 相当于遍历了
  • range

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    range = 迭代器的效果
    简单理解成遍历没有问题

    for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

    str := "abcdefgHiGKLmn"

    result := ""
    for _, value := range str {
    result += string(value)
    }
    • 举个栗子

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      //字母大小写变化

      func changeBigSmallWord(str string) string{
      result := ""
      for i,value := range str{
      if i%2==0 {
      result += strings.ToUpper(string(value))
      }else {
      result += strings.ToLower(string(value))
      }
      }
      return result
      }
      func main{
      str2 := "abcdefGHIGKLMN"
      result2 := changeBigSmallWord(str2)
      fmt.Println(result2)
      }

      >>AbCdEfGhIgKlMn
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      for 和 for range有什么区别?

      主要是使用场景不同

      for可以

      遍历array和slice
      遍历key为整型递增的map
      遍历string

      for range可以完成所有for可以做的事情,却能做到for不能做的,包括

      遍历key为string类型的map并同时获取key和value
      遍历channel
  • switch

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch var1 {
    case val1:
    ...
    case val2:
    ...
    default:
    ...
    }

    变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。
    • 举个栗子

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      package main

      import "fmt"

      func main() {
      /* 定义局部变量 */
      var grade string = "B"
      var marks int = 90

      switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"
      default: grade = "D"
      }

      switch {
      case grade == "A" :
      fmt.Printf("优秀!\n" )
      case grade == "B", grade == "C" :
      fmt.Printf("良好\n" )
      case grade == "D" :
      fmt.Printf("及格\n" )
      case grade == "F":
      fmt.Printf("不及格\n" )
      default:
      fmt.Printf("差\n" )
      }
      fmt.Printf("你的等级是 %s\n", grade )
      }


      优秀!
      你的等级是 A
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      比较好理解,和java中的类似,下面来看一些不太一样的,比如case中包含 && || 等,或者是判断某个 interface 变量中实际存储的变量类型

      定义语句: Type switch
      Type Switch 语法格式如下:
      switch x.(type){
      case type:
      statement(s)
      case type:
      statement(s)
      /* 你可以定义任意个数的case */
      default: /* 可选 */
      statement(s)
      }

      实例:
      package main

      import "fmt"

      func main() {
      var x interface{}
      //写法一:
      switch i := x.(type) { // 带初始化语句
      case nil:
      fmt.Printf(" x 的类型 :%T\r\n", i)
      case int:
      fmt.Printf("x 是 int 型")
      case float64:
      fmt.Printf("x 是 float64 型")
      case func(int) float64:
      fmt.Printf("x 是 func(int) 型")
      case bool, string:
      fmt.Printf("x 是 bool 或 string 型")
      default:
      fmt.Printf("未知型")
      }
      //写法二
      var j = 0
      switch j {
      case 0:
      case 1:
      fmt.Println("1")
      case 2:
      fmt.Println("2")
      default:
      fmt.Println("def")
      }
      //写法三
      var k = 0
      switch k {
      case 0:
      println("fallthrough")
      fallthrough
      /*
      Go的switch非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项;
      而如果switch没有表达式,它会匹配true。
      Go里面switch默认相当于每个case最后带有break,
      匹配成功后不会自动向下执行其他case,而是跳出整个switch,
      但是可以使用fallthrough强制执行后面的case代码。
      */
      case 1:
      fmt.Println("1")
      case 2:
      fmt.Println("2")
      default:
      fmt.Println("def")
      }
      //写法三
      var m = 0
      switch m {
      case 0, 1:
      fmt.Println("1")
      case 2:
      fmt.Println("2")
      default:
      fmt.Println("def")
      }
      //写法四
      var n = 0
      switch { //省略条件表达式,可当 if...else if...else
      case n > 0 && n < 10:
      fmt.Println("i > 0 and i < 10")
      case n > 10 && n < 20:
      fmt.Println("i > 10 and i < 20")
      default:
      fmt.Println("def")
      }
      }

      结果为:
      x 的类型 :<nil>
      fallthrough
      1
      1
      def
  • 循环控制Goto、Break、Continue

    1
    2


请关注我的个人博客

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。
Copyright 2018-2019 YMLiang'BLOG   |   京ICP备 - 19039949  |  载入天数...载入时分秒...