這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Comma-ok斷言的文法是:value, ok := element.(T)。element必須是介面類型的變數,T是普通類型。如果宣告失敗,ok為false,否則ok為true並且value為變數的值。來看個例子:
package mainimport ( "fmt")type Html []interface{}func main() { html := make(Html, 5) html[0] = "div" html[1] = "span" html[2] = []byte("script") html[3] = "style" html[4] = "head" for index, element := range html { if value, ok := element.(string); ok { fmt.Printf("html[%d] is a string and its value is %s\n", index, value) } else if value, ok := element.([]byte); ok { fmt.Printf("html[%d] is a []byte and its value is %s\n", index, string(value)) } }}
其實Comma-ok斷言還支援另一種簡化使用的方式:value := element.(T)。但這種方式不建議使用,因為一旦element.(T)宣告失敗,則會產生執行階段錯誤。如:
package mainimport ( "fmt")func main() { var val interface{} = "good" fmt.Println(val.(string)) // fmt.Println(val.(int))}
以上的代碼中被注釋的那一行會執行階段錯誤。這是因為val實際儲存的是string類型,因此宣告失敗。
還有一種轉換方式是switch測試。既然稱之為switch測試,也就是說這種轉換方式只能出現在switch語句中。可以很輕鬆的將剛才用Comma-ok斷言的例子換成由switch測試來實現:
package mainimport ( "fmt")type Html []interface{}func main() { html := make(Html, 5) html[0] = "div" html[1] = "span" html[2] = []byte("script") html[3] = "style" html[4] = "head" for index, element := range html { switch value := element.(type) { case string: fmt.Printf("html[%d] is a string and its value is %s\n", index, value) case []byte: fmt.Printf("html[%d] is a []byte and its value is %s\n", index, string(value)) case int: fmt.Printf("invalid type\n") default: fmt.Printf("unknown type\n") } }}