类型判断

Go 语言中,一个接口类型 interface{} 可以存储其他任何类型(如 int, string, byte 等)的值。
而且 Go 语言中提供的容器 list,其节点的值类型就是 interface{},它不可以被直接使用。

  1. type Element struct {
  2. next, prev *Element
  3. list *List
  4. Value interface{} // !!!
  5. }

我们可以通过类型断言来确定一个接口类型的变量是否包含了某个类型的值。

  1. var i interface{} = "abc"
  2. if s, ok := i.(string); ok {
  3. fmt.Printf("i has a string value %s", s)
  4. }

type-switch

type-switch 也是一种检测接口变量的类型的有效方法。
比如我们希望检测一个 []interface{} 数组里面每一元素的值:

  1. func getType(test []interface{}) {
  2. for _, t := range test {
  3. switch t.(type) {
  4. case int:
  5. fmt.Printf("type %T with value %v\n", t, t)
  6. case float64:
  7. fmt.Printf("type %T with value %v\n", t, t)
  8. case rune:
  9. fmt.Printf("type %T with value %c\n", t, t)
  10. case string:
  11. fmt.Printf("type %T with value %v\n", t, t)
  12. case nil:
  13. fmt.Printf("type %T with value %v\n", t, t)
  14. default:
  15. fmt.Printf("unknown type\n")
  16. }
  17. }
  18. }