Golang入門-流程控制

  • if
        var number int
        if number := 4; 100 > number {       //標識符的重聲明:只要對同一個標識符的兩次聲明各自
            number += 3                        所在的代碼塊之間存在包含的關係,就會形成對該標識
        } else if 100 < number {               符的重聲明。
            number -= 2
        } else {
            fmt.Println("OK!")
        }                                    //執行後 第二個number爲7 第一個爲0
  • switch
    1:表達式switch語句        //帶初始化語句
    
    names := []string{"Golang", "Java", "Rust", "C"}
    switch name := names[0]; name {
    case "Golang":
        fmt.Println("A programming language from Google.")
    case "Rust":
        fmt.Println("A programming language from Mozilla.")
    default:
        fmt.Println("Unknown!")
    }
    
    2:類型switch語句
    
    v := 11
    switch i := interface{}(v).(type) {    //取變量的類型  interface{}($v).(type)
    case int, int8, int16, int32, int64:
        fmt.Printf("A signed integer: %d. The type is %T. \n", i, i)
    case uint, uint8, uint16, uint32, uint64:
        fmt.Printf("A unsigned integer: %d. The type is %T. \n", i, i)
    default:
        fmt.Println("Unknown!")
    }

      fallthrough。它既是一個關鍵字,又可以代表一條語句。fallthrough語句可被包含在表達式switch語句中的case語句中。它的作用是使控制權流轉到下一個case。不過要注意,fallthrough語句僅能作爲case語句中的最後一條語句出現。並且,包含它的case語句不能是其所屬switch語句的最後一條case語句。

  • for
    map1 := map[int]string{1: "Golang", 2: "Java", 3: "Python", 4: "C"}
    for k,v := range map1 {
        fmt.Printf("%d: %s \n",k,v)
    }

     

  • select

       select語句屬於條件分支流程控制方法,不過它只能用於通道。它可以包含若干條case語句,並根據條件選擇其中的一個執行。進一步說,select語句中的case關鍵字只能後跟用於通道的發送操作的表達式以及接收操作的表達式或語句。

       如果一條select語句中不存在default case, 並且在被執行時其中的所有case都不滿足執行條件,那麼它的執行將會被阻塞!當前流程的進行也會因此而停滯。直到其中一個case滿足了執行條件,執行纔會繼續。我們一直在說case執行條件的滿足與否取決於其操作的通道在當時的狀態。這裏特別強調一點,即:未被初始化的通道會使操作它的case永遠滿足不了執行條件。對於針對它的發送操作和接收操作來說都是如此。
  
       break語句也可以被包含在select語句中的case語句中。它的作用是立即結束當前的select語句的執行,不論其所屬的case語句中是否還有未被執行的語句。

    //輸出 No Data   1   End.
    ch4 := make(chan int, 1)
	for i := 0; i < 4; i++ {
		select {
		case e, ok := <-ch4:
			if !ok {
				fmt.Println("End.")
				return
			}
			fmt.Println(e)
			
		default:
			fmt.Println("No Data!")
			
		}
	}                  
  • defer

   defer語句僅能被放置在函數或方法中。它由關鍵字defer和一個調用表達式組成。當一個函數中存在多個defer語句時,它們攜帶的表達式語句的執行順序一定是它們的出現順序的倒序。

//會輸出迴文  0 1 1 2 3 5 8 13 21 34 34 21 13 8 5 3 2 1 1 0 
func main() {
	for i := 0; i < 10; i++ {
        defer func(n int) {
              fmt.Printf("%d ", n)
        }(func() int {
              n := fibonacci(i)
        fmt.Printf("%d ", n)
         return n
        }())
		
		
	}
}

func fibonacci(num int) int {
	if num == 0 {
		return 0
	}
	if num < 2 {
		return 1
	}
	return fibonacci(num-1) + fibonacci(num-2)
}
  • error

   

type error interface { 
    Error() string
}

    errors.New是一個很常用的函數。在Go語言標準庫的代碼包中有很多由此函數創建出來的錯誤值,比如os.ErrPermissionio.EOF等變量的值

error是Go語言內置的一個接口類型

  • panic

       panic可被意譯爲運行時恐慌

       內建函數panicrecover是天生的一對。前者用於產生運行時恐慌,而後者用於“恢復”它。不過要注意,recover函數必須要在defer語句中調用纔有效。因爲一旦有運行時恐慌發生,當前函數以及在調用棧上的所有代碼都是失去對流程的控制權。只有defer語句攜帶的函數中的代碼纔可能在運行時恐慌迅速向調用棧上層蔓延時“攔截到”它。

    defer func() {
      if p := recover(); p != nil {
          fmt.Printf("Fatal error: %s\n", p)
     }
    }()
  • go

 

發佈了49 篇原創文章 · 獲贊 3 · 訪問量 9335
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章