Go 常量、init、陣列、型別轉換與斷言、Recover

衣舞晨風發表於2017-11-15

一、常量

    Go中的常量僅僅就是—常量。它們是在編譯時被建立,即使被定義為函式區域性的也如此,並且只能是數字,字元(符文),字串或者布林型別。由於編譯時的限制,定義它們的表示式必須為能被編譯器求值的常量表示式。例如,1<<3是一個常量表示式,而math.Sin(math.Pi/4)不是,因為函式呼叫math.Sin需要在執行時才發生。

二、init

    每個原始檔可以定義自己的不帶引數的(niladic)init函式,來設定它所需的狀態。(實際上每個檔案可以有多個init函式。)init是在程式包中所有變數宣告都被初始化,以及所有被匯入的程式包中的變數初始化之後才被呼叫。

    除了用於無法通過宣告來表示的初始化以外,init函式的一個常用法是在真正執行之前進行驗證或者修復程式狀態的正確性。

三、陣列

    在Go和C中,陣列的工作方式有幾個重要的差別。在Go中:

  • 陣列是值。將一個陣列賦值給另一個,會拷貝所有的元素。
  • 特別是,如果你給函式傳遞一個陣列,其將收到一個陣列的拷貝,而不是它的指標。
  • 陣列的大小是其型別的一部分。型別[10]int和[20]int是不同的。

四、斷言

str := value.(string)

    不過,如果該值不包含一個字串,則程式會產生一個執行時錯誤。為了避免這樣,可以使用“comma, ok”的習慣用法來安全地測試值是否為一個字串:

str, ok := value.(string)
if ok {
    fmt.Printf("string value is: %q\n", str)
} else {
    fmt.Printf("value is not a string\n")
}

    如果型別斷言失敗,則str將依然存在,並且型別為字串,不過其為零值,一個空字串。

五、Recover

    對於一些隱式的執行時錯誤,如切片索引越界、型別斷言錯誤等情形下,panic方法就會被呼叫,它將立刻中斷當前函式的執行,並展開當前Goroutine的呼叫棧,依次執行之前註冊的defer函式。當棧展開操作達到該Goroutine棧頂端時,程式將終止。但這時仍然可以使用Go的內建recover方法重新獲得Goroutine的控制權,並將程式恢復到正常執行的狀態。

    呼叫recover方法會終止棧展開操作並返回之前傳遞給panic方法的那個引數。由於在棧展開過程中,只有defer型函式會被執行,因此recover的呼叫必須置於defer函式內才有效。

本文整理自:https://www.kancloud.cn/kancloud/effective/72199

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章