讓我們一起Go(十三)

2022-02-10 10:04:05 字數 1110 閱讀 9624

上篇,我們了解了go語言介面的一些知識,在這篇中,我們將繼續聊聊介面這東西。

go語言中定義乙個空介面,也就是沒有任何函式需要實現的介面就是乙個空介面,作為乙個空介面,因為物件無需實現它的函式,所以它可以指向任何物件,看下面的示例:

上面的empty介面變數分別可以被賦值為int型別,string型別,結構型別和陣列型別等等。最後,使用println列印出相應的內容。那麼,fmt包的println函式又是如何知道這個要列印的變數是什麼型別的呢?這就需要用到介面的型別斷言了。

什麼是型別斷言呢?型別斷言是在執行時才會起推斷作用的,既然是型別斷言,當然是對變數是什麼型別進行判斷了。如上面的例子,最後說的println函式,其實它的函式引數是這樣的:

通過之前的學習,我們知道這是乙個可變引數,而且型別是乙個空介面,空介面是可以指向任何物件的,繼續翻出fprintln函式,然後繼續往下翻,最終會檢視該型別是否實現了string()方法,有的話就直接反射來變數成員。對於內建型別則如下:

未把全部**展示出來,但是我們已經看到了型別斷言的用法了。斷言出型別後,就會通過switch case去匹配型別,如果匹配到就執行相應的操作。知道了用法,我們也來試試吧:

這樣在執行時,go語言斷言了i的型別,並執行了相應操作。為了證明這是在執行時發生的,我們再來看乙個例子:

完成後,我們可以順利的完成編譯,但是執行後會有乙個panic:

告訴我們原來是沒有實現testone的方法。

今天就到這裡,關於型別斷言今天就有個認識就可以了,以後我們會用它解決更實際的東西。

讓我們一起Go 七

這裡的例子很好的解釋了,字串的不可變性,當你把13行注釋去掉後,編譯該檔案就會報錯,因為不允許修改字串內容。很多初學者可能認為第10行不是改變字串內容了嗎?這種理解是錯誤的,第10行只是將變數cat指向了另乙個記憶體位址,原來字串並沒改變,你改變的只是變數的位址。或許有人有疑問,第13行是不是單引號...

摩卡,讓我們一起成長

本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...

摩卡,讓我們一起成長

本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...