剛開始接觸golang,可能對interface的使用有些迷惑,尤爲在有些資料裏,介紹得更是雲裏霧裏,讓人搞不清楚。本文嘗試從類型轉換的角度來解析interface,但願對你們能有所幫助。很少說,先上代碼。golang
package main import ( "fmt" ) func main() { var general interface{} general = 6.6 type_cast(general) general = 2 type_cast(general) } func type_cast(general interface{}) { switch general.(type) { case int : fmt.Println("the general type is int") newInt, ok := general.(int) check_convert(ok) fmt.Println("newInt 的值原本是", newInt) newInt += 2 fmt.Println("加2後,結果是", newInt) newInt -= 6 fmt.Println("接着減6後,結果是", newInt) newInt *= 4 fmt.Println("而後乘4,結果是", newInt) newInt /= 3 fmt.Println("最後除3,結果是", newInt) fmt.Println() fmt.Println() case float32: fmt.Println("the general type is float32") newFloat32, ok := general.(float32) check_convert(ok) fmt.Println("newFloat32 的值原本是", newFloat32) newFloat32 += 2.0 fmt.Println("加2.0後,結果是", newFloat32) newFloat32 -= 6.0 fmt.Println("接着減6.0後,結果是", newFloat32) newFloat32 *= 4.0 fmt.Println("而後乘4.0,結果是", newFloat32) newFloat32 /= 3.0 fmt.Println("最後除3.0,結果是", newFloat32) fmt.Println() fmt.Println() case float64: fmt.Println("the general type is float64") newFloat64, ok := general.(float64) check_convert(ok) fmt.Println("newFloat64 的值原本是", newFloat64) newFloat64 += 2.0 fmt.Println("加2.0後,結果是", newFloat64) newFloat64 -= 6.0 fmt.Println("接着減6.0後,結果是", newFloat64) newFloat64 *= 4.0 fmt.Println("而後乘4.0,結果是", newFloat64) newFloat64 /= 3.0 fmt.Println("最後除3.0,結果是", newFloat64) fmt.Println() fmt.Println() default: fmt.Println("unknown type") } } func check_convert(ok bool) { if false == ok { panic("type cast failed!") } }
程序運行結果爲:函數
從上面結果能夠知道,浮點數類型默認爲float64。還有一點要注意的是,newInt, ok := general.(int),其中ok是bool值;而在golang中,相似這種返回多個值的其餘語句,ok的值常常會與nil相比較。spa
interface{}是一個通用類型,能夠儲存任意類型的值。在代碼前面,聲明瞭一個名爲general的interface{}值,而後依次存儲一個浮點數和一個整數,經過switch general.(type)判斷general存儲的值的類型,而後按照類型使用相似general.(int)的方法對general進行類型轉換(其實是接口查詢或者接口轉換,做用是判斷general是否實現了int的方法;之因此叫類型轉換,是由於interface{}裏面沒有定義任何方法,並且它的做用也的確跟類型轉換同樣)。在這裏用數字作例子,是由於數字簡單,容易理解。咱們知道,數字能夠進行四則運算,在這裏,我對general轉換獲得的數字進行加法運算,加2,而後打印加法的結果。從運行結果來看,通過轉換後的數字能夠進行正確的數字運算。各位能夠本身算算。code
從上面程序能夠看出使用interface的過程,把其餘類型的值賦值給interface,而後進行接口查詢,ok就進行符合這個類型的操做。也就是說只要這個類型的操做函數跟interface裏面定義的函數聲明相同,就可使用這個interface。duck type定義就是:If it walks like a duck and quacks like a duck, it's a duck。中文意思大概是,若是它走得像一個鴨子,並且也像鴨子嘎嘎叫,那麼它就是鴨子。你們能夠參考其餘使用interface的例子來參考,在這裏就很少作解釋,水平有限。blog
轉貼請註明來自:格通接口