<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ### Switch 語句 ***** #### 提供背判斷的值 ``` switch var1 { case val1: ... case val2: ... default: ... } ``` 變量 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被局限于常量或整數,但必須是相同的類型;或者最終結果為相同類型的表達式。前花括號 { 必須和 switch 關鍵字在同一行。 **不需要特別使用 break 語句來表示結束。** 如果在執行完每個分支的代碼后,還希望**繼續執行后續分支的代碼**,可以使用 **fallthrough** 關鍵字來達到目的。 ` ` #### 不提供被判斷的值 ``` switch { case condition1: ... case condition2: ... default: ... } ``` #### 包含初始化語句: ``` switch initialization { case val1: ... case val2: ... default: ... } ``` ` ` ### Select控制 ***** select是Go中的一個控制結構,類似于switch語句,用于處理異步IO操作。select會監聽case語句中channel的讀寫操作,當case中channel讀寫操作為非阻塞狀態(即能讀寫)時,將會觸發相應的動作。 >select中的case語句必須是一個channel操作 select中的default子句總是可運行的。 * 如果有多個case都可以運行,select會隨機公平地選出一個執行,其他不會執行。 * 如果沒有可運行的case語句,且有default語句,那么就會執行default的動作。 * 如果沒有可運行的case語句,且沒有default語句,select將阻塞,直到某個case通信可以運行。 ``` package main import ( "fmt" "time" ) func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } case <-time.After(time.Second * 3): //超時退出 fmt.Println("request time out") } } // 輸出:request time out ``` ` ` ### For循環 ***** 最簡單的基于計數器的迭代,基本形式為: ``` for 初始化語句; 條件語句; 修飾語句 {} ``` 這三部分組成的循環的頭部,它們之間使用分號 ; 相隔,但并不需要括號 () 將它們括起來。 您還可以在循環中同時使用多個計數器: ``` for i, j := 0, N; i < j; i, j = i+1, j-1 {} ``` 這得益于 Go 語言具有的平行賦值的特性,for 結構的第二種形式是沒有頭部的條件判斷迭代(類似其它語言中的 while 循環),基本形式為:for 條件語句 {}。 ` ` 條件語句是可以被省略的,如 i:=0; ; i++ 或 for { } 或 for ;; { }(;; 會在使用 Gofmt 時被移除):這些循環的本質就是無限循環。 最后一個形式也可以被改寫為 for true { },但一般情況下都會直接寫 **for { }**。 ` ` ### for-range結構 ***** 這是 Go 特有的一種的迭代結構,您會發現它在許多情況下都非常有用。它可以迭代任何一個集合(包括數組和 map),同時可以獲得每次迭代所對應的索引。一般形式為: ``` for ix, val := range coll { } ``` 要注意的是,val 始終為集合中對應索引的值拷貝,因此它一般只具有只讀性質,對它所做的任何修改都不會影響到集合中原有的值(注:如果 val 為指針,則會產生指針的拷貝,依舊可以修改集合中的原值)。 ` ` ### **break** ***** 一個 break 的作用范圍為該語句出現后的最內部的結構,它可以被用于任何形式的 for 循環(計數器、條件判斷等)。 但在 switch 或 select 語句中,break 語句的作用結果是跳過整個代碼塊,執行后續的代碼。 ` ` ### **continue** ` ` 關鍵字 continue 忽略剩余的循環體而直接進入下一次循環的過程,但不是無條件執行下一次循環,執行之前依舊需要滿足循環的判斷條件。 關鍵字 continue 只能被用于 for 循環中。 ` ` ### **label** ***** 在Golang中能使用`Label`的有`goto`,`break`,`continue`. 這篇文章就介紹下Golang中`Label`使用和注意點. 注意點: 1. `Label`在continue, break中是`可選的`, 但是在`goto`中是`必須的` 2. 作用范圍: 定義`Label`的函數體內. 3. `Label`可以聲明在函數體的任何位置, 不管`Label`聲明在`調用點`的前面還是后面. ` ` #### goto 1. `Label`在`goto`是必須的 ``` package main import ( "fmt" ) func main() { fmt.Println(1) goto End //goto 10: syntax error: unexpected . at end of statement fmt.Println(2) End: fmt.Println(3) } ``` 2.`Label`可以聲明在函數體的任何地方 3.`Label`的作用范圍是在函數體中 4.`Label`在嵌套函數(閉包)是不可用的. 不管是在`閉包里`調用`閉包外`的Label, 還是在`閉包外`調用`閉包里`的Label: ``` package main import ( "fmt" ) func main() { fmt.Println(1) func() { fmt.Println("Nested function") goto End }() End: fmt.Println(2) } ``` 5.不能重復定義`Label` 6.`Label`和變量名是`不沖突的`, 可以定義一個名為`x`的變量和名為`x`的Label(不過不建議這么用, 這么寫會被人罵的); 而且`Label`是區分大小寫的. 7.變量的聲明必須在`goto`之前.因為任何變量的聲明都不能被跳過. ` ` #### break(不帶label) `break`一般用來跳出`最近`一層的`switch`和`for`, 注意不能用在`select`上 1.單層循環 ``` package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { fmt.Println(i) if i == 3 { break } } } //out 0 1 2 3 ``` 2.雙層循環 ``` package main import ( "fmt" ) func main() { for i := 0; i < 3; i++ { for j := 0; j < 5; j++ { fmt.Println("i:", i, ",j:", j) if j == 2 { break } } } } //Output i: 0 ,j: 0 i: 0 ,j: 1 i: 0 ,j: 2 i: 1 ,j: 0 i: 1 ,j: 1 i: 1 ,j: 2 i: 2 ,j: 0 i: 2 ,j: 1 i: 2 ,j: 2 ``` 從這個例子可以看出`break`只能跳出最近`for` 3.對于`c/c++`來說,`switch/case`一般都是配合`break`來使用的.但是在`golang`中`switch/case`不需要`break`就能夠實現和`c/c++`一樣的效果. 4.`break`在函數里是不起作用的, 不能傳遞出來. ` ` #### break(Label) + continue ``` func main() { LABEL_1: for i := 0; i < 10; i++ { if i == 8 { goto END } if i%2 == 0 { for { continue LABEL_1 } } index := 0 LABEL_2: for { index++ fmt.Println("index ", index) break LABEL_2 } fmt.Println("i ", i) } fmt.Println("after loop") END: fmt.Println("end") } ``` break和continue的label必須寫在代碼塊的前面 其中,break label 將直接跳出循環,即不再執行label所標記的循環 而continue label 則將繼續執行循環,即開始下一次循環 ``` index 1 i 1 index 1 i 3 index 1 i 5 index 1 i 7 end ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看