# 11.4 類型判斷:type-switch
接口變量的類型也可以使用一種特殊形式的 swtich
來檢測:type-swtich (下面是示例 11.4 的第二部分):
switch t := areaIntf.(type) {
case *Square:
fmt.Printf("Type Square %T with value %v\n", t, t)
case *Circle:
fmt.Printf("Type Circle %T with value %v\n", t, t)
case nil:
fmt.Printf("nil value: nothing to check?\n")
default:
fmt.Printf("Unexpected type %T\n", t)
}
輸出:
Type Square *main.Square with value &{5}
變量 t
得到了 areaIntf
的值和類型, 所有 case
語句中列舉的類型(nil
除外)都必須實現對應的接口(在上例中即 Shaper
),如果被檢測類型沒有在 case
語句列舉的類型中,就會執行 default
語句。
可以用 type-switch
進行運行時類型分析,但是在 type-switch
不允許有 fallthrough
。
如果僅僅是測試變量的類型,不用它的值,那麼就可以不需要賦值語句,比如:
switch areaIntf.(type) {
case *Square:
// TODO
case *Circle:
// TODO
...
default:
// TODO
}
下面的代碼片段展示了一個類型分類函數,它有一個可變長度參數,可以是任意類型的數組,它會根據數組元素的實際類型執行不同的動作:
func classifier(items ...interface{}) {
for i, x := range items {
switch x.(type) {
case bool:
fmt.Printf("Param #%d is a bool\n", i)
case float64:
fmt.Printf("Param #%d is a float64\n", i)
case int, int64:
fmt.Printf("Param #%d is a int\n", i)
case nil:
fmt.Printf("Param #%d is a nil\n", i)
case string:
fmt.Printf("Param #%d is a string\n", i)
default:
fmt.Printf("Param #%d is unknown\n", i)
}
}
}
可以這樣調用此方法:classifier(13, -14.3, "BELGIUM", complex(1, 2), nil, false)
。
在處理來自於外部的、類型未知的數據時,比如解析諸如 JSON 或 XML 編碼的數據,類型測試和轉換會非常有用。
在示例 12.17(xml.go)中解析 XML 文檔時,我們就會用到 type-switch
。
練習 11.4 simple_interface2.go:
接着練習 11.1 中的內容,創建第二個類型 RSimple
,它也實現了接口 Simpler
,寫一個函數 fi
,使它可以區分 Simple
和 RSimple
類型的變量。
鏈接
- 目錄
- 上一節:類型斷言:如何檢測和轉換接口變量的類型
- 下一節:測試一個值是否實現了某個接口