<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go 專欄|流程控制,一網(wǎng)打盡

          共 10037字,需瀏覽 21分鐘

           ·

          2021-08-11 14:16

          最近看奧運(yùn)會(huì)看的我熱血沸騰,中國(guó)奧運(yùn)健兒簡(jiǎn)直太棒了,不只是成績(jī),還有氣質(zhì),精氣神,全方位的棒。

          而且這次奧運(yùn)會(huì)我覺得最感動(dòng)的是,看到一些年紀(jì)大的運(yùn)動(dòng)員拿了好成績(jī):呂小軍 37 歲,馬龍 32,蘇炳添 32,鞏立姣 32 歲才拿了自己的第一塊奧運(yùn)金牌。連這么受限于年齡的運(yùn)動(dòng)員都能不斷突破自己,何況我們呢?還每天在網(wǎng)上焦慮程序員 35 歲就要被優(yōu)化?

          所以別給自己找年齡作為借口了,覺得年齡大了這不行那不行,干就完事了。

          if-else

          特點(diǎn):

          • 條件語句不需要使用小括號(hào) () 包起來;

          • 花括號(hào) {} 必須有,并且左花括號(hào) { 必須和 ifelse 在同一行;

          • if 之后,條件語句之前可以添加變量初始化語句,使用 ; 分隔。

          package main

          import "fmt"

          func main() {
              if 7%2 == 0 {
                  fmt.Println("7 is even")
              } else {
                  fmt.Println("7 is odd"// 7 is odd
              }

              if 8%4 == 0 {
                  fmt.Println("8 is divisible by 4"// 8 is divisible by 4
              }

              if num := 9; num < 0 {
                  fmt.Println(num, "is negative")
              } else if num < 10 {
                  fmt.Println(num, "has 1 digit"// 9 has 1 digit
              } else {
                  fmt.Println(num, "has multiple digits")
              }
          }

          switch

          特點(diǎn):

          • 左花括號(hào) { 必須和 switch 在同一行;

          • 條件表達(dá)式不限制常量或者整數(shù);

          • switch 后可添加變量初始化語句,使用 ; 分割;

          • 可以不設(shè)定條件表達(dá)式,在此種情況下,整個(gè) switch 結(jié)構(gòu)與多個(gè) if-else 的邏輯作用等同;

          • 單個(gè) case 中可以出現(xiàn)多個(gè)結(jié)果選項(xiàng);

          • case 中添加 fallthrough 關(guān)鍵字,會(huì)繼續(xù)執(zhí)行緊跟的下一個(gè) case,不需要判斷 case 的條件語句;

          • switch 支持 default 語句,當(dāng)所有 case 都不滿足時(shí),執(zhí)行 default 語句。

          package main

          import (
              "fmt"
              "time"
          )

          func main() {
              i := 2
              fmt.Print("write ", i, " as ")
              switch i {
              case 1:
                  fmt.Println("one")
              case 2:
                  fmt.Println("two"// write 2 as two
                  fallthrough
              case 3:
                  fmt.Println("three"// three
              case 456:
                  fmt.Println("four, five, six")
              }

              switch num := 9; num {
              case 1:
                  fmt.Println("one")
              default:
                  fmt.Println("nine"// nine
              }

              switch time.Now().Weekday() {
              case time.Saturday, time.Sunday:
                  fmt.Println("it's the weekend")
              default:
                  fmt.Println("it's a weekday"// it's a weekday
              }

              t := time.Now()
              switch {
              case t.Hour() < 12:
                  fmt.Println("it's before noon")
              default:
                  fmt.Println("it's after noon"// it's after noon
              }
          }

          for

          特點(diǎn):

          • 條件表達(dá)式不需要使用小括號(hào) () 包起來;

          • 花括號(hào) {} 必須有,并且左花括號(hào) { 必須和 for 在同一行;

          • 支持 continuebreak

          package main

          import (
              "fmt"
          )

          func main() {
              i := 1
              // 只有條件
              for i <= 3 {
                  fmt.Println(i)
                  i = i + 1
              }

              // 有變量初始化和條件
              for j := 7; j <= 9; j++ {
                  fmt.Println(j)
              }

              // 死循環(huán)
              for {
                  fmt.Println("loop")
                  break
              }

              // 遍歷數(shù)組
              a := [...]int{10203040}
              for i := range a {
                  fmt.Println(i)
              }
              for i, v := range a {
                  fmt.Println(i, v)
              }

              // 遍歷切片
              s := []string{"a""b""c"}
              for i := range s {
                  fmt.Println(i)
              }
              for i, v := range s {
                  fmt.Println(i, v)
              }

              // 遍歷字典
              m := map[string]int{"a"10"b"20"c"30}
              for k := range m {
                  fmt.Println(k)
              }
              for k, v := range m {
                  fmt.Println(k, v)
              }
          }

          goto,break,continue

          goto 特點(diǎn):

          • 只能在函數(shù)內(nèi)跳轉(zhuǎn),需要配合標(biāo)簽一起使用;

          • 不能跳過內(nèi)部變量聲明語句;

          • 只能跳到同級(jí)作用域或者上層作用域內(nèi),不能跳到內(nèi)部作用域內(nèi)。

          package main

          import (
              "fmt"
          )

          func main() {
              // 跳出循環(huán)
              for i := 0; ; i++ {
                  if i == 2 {
                      goto L1
                  }
                  fmt.Println(i)
              }
          L1:
              fmt.Println("Done")

              // 跳過變量聲明,不允許
              //  goto L2
              //  j := 1
              // L2:
          }

          break 特點(diǎn):

          • 單獨(dú)使用,用于跳出 break 當(dāng)前所在的 forswitchselect 語句的執(zhí)行;

          • 和標(biāo)簽一起使用,用于跳出標(biāo)簽所標(biāo)識(shí)的 forswitchselect 語句的執(zhí)行,可用于跳出多重循環(huán),但標(biāo)簽和 break 必須在同一個(gè)函數(shù)內(nèi)。

          package main

          import (
              "fmt"
          )

          func main() {
              // break 跳轉(zhuǎn)到標(biāo)簽處,然后跳過 for 循環(huán)
          L3:
              for i := 0; ; i++ {
                  for j := 0; ; j++ {
                      if i >= 2 {
                          break L3
                      }
                      if j > 4 {
                          break
                      }
                      fmt.Println(i, j)
                  }
              }
          }

          continue 特點(diǎn):

          • 單獨(dú)使用,用于跳出 continue 當(dāng)前所在的 for 循環(huán)的本次迭代;

          • 和標(biāo)簽一起使用,用于跳出標(biāo)簽所標(biāo)識(shí)的 for 語句的本次選代,但標(biāo)簽和 continue 必須在同一個(gè)函數(shù)內(nèi)。

          package main

          import (
              "fmt"
          )

          func main() {
              // continue 跳轉(zhuǎn)到標(biāo)簽處,然后執(zhí)行 i++
          L4:
              for i := 0; ; i++ {
                  for j := 0; j < 6; j++ {
                      if i > 4 {
                          break L4
                      }
                      if i >= 2 {
                          continue L4
                      }
                      if j > 4 {
                          continue
                      }
                      fmt.Println(i, j)
                  }
              }
          }

          總結(jié)

          本文主要介紹了流程控制語句,分別是條件語句,選擇語句,循環(huán)語句和跳轉(zhuǎn)語句。

          • 條件語句: 對(duì)應(yīng)關(guān)鍵詞 ifelseelse if

          • 選擇語句: 對(duì)應(yīng)關(guān)鍵詞 switchcasefallthroughdefault

          • 循環(huán)語句: 對(duì)應(yīng)關(guān)鍵詞 forrange

          • 跳轉(zhuǎn)語句: 對(duì)應(yīng)關(guān)鍵詞 goto

          除此之外,還有 breakcontinue,都可以搭配循環(huán)語句和跳轉(zhuǎn)語句使用。

          跳轉(zhuǎn)語句在某些場(chǎng)景下會(huì)非常實(shí)用,但也很容易出現(xiàn)一些莫名其妙的問題,所以使用起來要更謹(jǐn)慎些。


          文章中的腦圖和源碼都上傳到了 GitHub,有需要的同學(xué)可自行下載。

          地址: https://github.com/yongxinz/gopher/tree/main/sc

          關(guān)注公眾號(hào) AlwaysBeta,回復(fù)「goebook」領(lǐng)取 Go 編程經(jīng)典書籍。

          Go 專欄文章列表:

          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日无码毛片 | 色婷婷精品国产一区二区 | 夜夜撸夜夜 | 啪啪啪啪啪啪网站 | 噜噜影院 |