乙個介面型別的變數 vari 中可以包含任何型別的值,必須有一種方式來檢測它的 動態 型別,即執行時在變數中儲存的值的實際型別。在執行過程中動態型別可能會有所不同,但是它總是可以分配給介面變數本身的型別。通常我們可以使用 型別斷言 來測試在某個時刻 vari 是否包含型別 t 的值:
v := vari.(t) // unchecked type assertion
vari 必須是乙個介面變數,否則編譯器會報錯:invalid type assertion: vari.(t) (non-inte***ce type (type of vari) on left) 。型別斷言可能是無效的,雖然編譯器會盡力檢查轉換是否有效,但是它不可能預見所有的可能性。如果轉換在程式執行時失敗會導致錯誤發生。更安全的方式是使用以下形式來進行型別斷言:
if v, ok := vari.(t); ok
// vari is not of type t
如果轉換合法,v 是 vari 轉換到型別 t 的值,ok 會是 true;否則 v 是型別 t 的零值,ok 是 false,也沒有執行時錯誤發生。應該總是使用上面的方式來進行型別斷言。
多數情況下,我們可能只是想在 if 中測試一下 ok 的值,此時使用以下的方法會是最方便的:
if _, ok := vari.(t); ok
``例子
--
package main
import (
「fmt」
「math」
)type square struct
type circle struct
type shaper inte***ce
func main()
if u, ok := areaintf.(*circle); ok else func (sq *square) area() float32
func (ci *circle) area() float32
「`the type of areaintf is: *main.square
areaintf does not contain a variable of type circle
程式行中定義了乙個新型別 circle,它也實現了 shaper 介面。 t, ok := areaintf.(*square); ok 測試 areaintf 裡是否乙個包含 『square』 型別的變數,結果是確定的;然後我們測試它是否包含乙個 『circle』 型別的變數,結果是否定的。
Go語言型別轉換和型別斷言
型別轉換在編譯期完成,包括強制轉換和隱式轉換 型別斷言在執行時確定,包括安全型別斷言和非安全型別斷言 go語言要求不同型別之間必須做顯式的型別轉換。但似乎涉及到介面型別時,就會有所不同。兩種型別斷言 不安全的型別斷言,如果系統檢測到不匹配,會在執行時呼叫內建的panic,丟擲異常 s abc i s...
python中變數和轉換型別type函式
一 python 中的變數賦值不需要型別宣告。每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。等號 用來給變數賦值。等號 運算子左邊是乙個變數名,等號 運算子右邊是儲存在變數中的值。二 python中支援四種不同型別 int 有符號整型 long 長整型 也可以代表八進位制和十六進製制 f...
day2 資料型別轉換和變數
格式 目標型別 變數名 public class helloworld 輸出結果為128,128,因為byte的範圍是 128至127,超了,所以應避免記憶體溢位的情況 public class helloworld 輸出結果為128 128.0。這是乙個低到高的轉換 注意上圖 float doub...