上篇,咱們瞭解了Go語言接口的一些知識,在這篇中,咱們將繼續聊聊接口這東西。數組
Go語言中定義一個空接口,也就是沒有任何函數須要實現的接口就是一個空接口,做爲一個空接口,由於對象無需實現它的函數,因此它能夠指向任何對象,看下面的示例:
上面的empty接口變量分別能夠被賦值爲int類型,string類型,結構類型和數組類型等等。最後,使用Println打印出相應的內容。那麼,fmt包的Println函數又是如何知道這個要打印的變量是什麼類型的呢?這就須要用到接口的類型斷言了。函數
什麼是類型斷言呢?類型斷言是在運行時纔會起推斷做用的,既然是類型斷言,固然是對變量是什麼類型進行判斷了。如上面的例子,最後說的Println函數,其實它的函數參數是這樣的:
經過以前的學習,咱們知道這是一個可變參數,並且類型是一個空接口,空接口是能夠指向任何對象的,繼續翻出Fprintln函數,而後繼續往下翻,最終會查看該類型是否實現了String()方法,有的話就直接反射來變量成員。對於內置類型則以下:
未把所有代碼展現出來,可是咱們已經看到了類型斷言的用法了。斷言出類型後,就會經過switch case去匹配類型,若是匹配到就執行相應的操做。知道了用法,咱們也來試試吧:
這樣在運行時,Go語言斷言了i的類型,並執行了相應操做。爲了證實這是在運行時發生的,咱們再來看一個例子:
完成後,咱們能夠順利的完成編譯,可是運行後會有一個panic:
告訴咱們原來是沒有實現Testone的方法。學習
今天就到這裏,關於類型斷言今天就有個認識就能夠了,之後咱們會用它解決更實際的東西。spa