goLang 類型斷言 type assertion

goLang有類型轉換/類型斷言/類型切換

1.類型斷言

類型斷言就是將接口類型的值(x),裝換成類型(T)。格式爲:spa

x.(T)
v:=x.(T)
v,ok:=x.(T)

類型斷言的必要條件就是x是接口類型,非接口類型的x不能作類型斷言code

var i int=10
v:=i.(int) //錯誤 i不是接口類型

T能夠是非接口類型,若是想斷言合法,則T應該實現x的接口接口

T也能夠是接口,則x的動態類型也應該實現接口Tip

var x interface{}=7  //x的動態類型爲int,值爲7
i:=x.(int)           // i的類型爲int ,值爲7

type I interface {m()}
var y I

s:=y.(string)      //非法: string 沒有實現接口 I (missing method m)
r:=y.(io.Reader)   //y若是實現了接口io.Reader和I的狀況下,  r的類型則爲io.Reader

類型斷言若是非法,運行時就會出現錯誤,爲了不這種錯誤,能夠使用一下語法:get

v,ok:=x.(T)

ok表明類型斷言是否合法,若是非法,ok則爲false,這樣就不會出現panicstring

2.類型切換 type switch

類型切換用來比較類型而不是對值進行比較

type switch它用於檢測的是值x的類型T是否匹配某個類型.it

格式以下,相似類型斷言,可是括號內的不是某個具體的類型,而是單詞type:io

switch x.(type){
  
 }

type switch語句中能夠有一個簡寫的變量聲明,這種狀況下,等價於這個變量聲明在每一個case clause 隱式代碼塊的開始位置。若是case clause只列出了一個類型,則變量的類型就是這個類型,不然就是原始值的類型class

假設下面的例子中的x的類型爲x interface{}:變量

switch i := x.(type) {
case nil:
  printString("x is nil") // i的類型是 x的類型 (interface{})
case int:
  printInt(i) // i的類型 int
case float64:
  printFloat64(i) // i的類型是 float64
case func(int) float64:
  printFunction(i) // i的類型是 func(int) float64
case bool, string:
  printString("type is bool or string") // i的類型是 x (interface{})
default:
  printString("don't know the type") // i的類型是 x的類型 (interface{})
}

也許你已經看到上面的例子中有一個case clause中的類型是nil,它用來匹配x爲nil的interface{}的狀況。

clipboard.png

運行結果以下:

clipboard.png

參考文章:http://colobu.com/2016/06/21/...

相關文章
相關標籤/搜索