1、組合
Go語言使用組合來完成型別的設計,設計某一型別時想要擁有其他型別的功能只需要將其他型別嵌入該型別即可。
2、介面
與其他語言不同的是,編譯器會自動判斷該型別是否符合某正在使用的介面,甚至不需要特定的宣告『這個型別繼承了某介面』,只要實現了這個介面的行為,那麼編譯器會判斷這個型別有這個介面。通俗的比較 Java『你是飛行員嗎,是,可以駕駛飛機』,Go『你會駕駛飛機嗎,會,可以駕駛飛機』。
沒有複雜的介面型別判斷之後,我們可以更方便的使用介面(執行時會幫我們完成判斷)。
注意
和普通型別不同的是,介面型別有嚴格的型別檢查,指標接受者方法必須由指標型別的原始值呼叫,編譯器不會把值型別自動轉換為指標型別,如下:
package main import ( "fmt" ) type Type1 struct { aa int } type dotest interface{ test1() test2() } func (t *Type1) test1() { fmt.Println("test1"); } func (t Type1) test2() { fmt.Println("test2"); } func callfunc(ty dotest){ ty.test1() ty.test2() } func main() { ty := Type1{2} callfunc(&ty) //必須傳指標型別,否則無法執行test1方法
}
至於為什麼會這樣,這和golang的介面設計有關,請參照https://blog.csdn.net/D_Guco/article/details/78507999