2017-07-18 100 views
3

也許我並不完全熟悉仿製藥的力量,但空接口interface{}與普通仿真器有什麼不同,特別是如果我們有能力使用反射或類型開關?人們總是提到Go沒有泛型,但是interface{}看起來好像和Java的<T>這類工作非常相似。空白接口與普通接口有什麼不同?

回答

6

如果您來自Java,那麼空接口(interface{})實際上更接近於使用Java中的Object變量而不是泛型。

您可以將任何內容分配給interface{}(就像您可以使用Java中的Object變量一樣)。

但是,如果您想使用您存儲在那裏的實際類型(與在Java中使用Object變量相同),則應該「返回」或「鍵入斷言」。

Java中的泛型非常不同,因爲它們允許您在編譯時進行類型檢查。不同之處在於,如果您使用泛型,則無需採用反射或類型切換。

你可以在這裏閱讀更多關於Java泛型:

https://docs.oracle.com/javase/tutorial/java/generics/

然後按照這一點,接下來的2個或3個步驟轉到巡演這裏更多的空接口是如何工作的:

https://tour.golang.org/methods/14

+0

那麼在Go中,它在運行時檢查而不是編譯時間的主要區別是什麼? – ollien

+1

是的。由於Go沒有「泛型」功能,因此可以使用interface {}並進行運行時檢查(與Java開發人員在將泛型編譯爲語言之前一樣)。請注意,Go中的集合(切片,地圖)是鍵入的,因此對泛型的需求不是那麼重要,因爲集合是您需要此功能的最顯眼的地方。 – eugenioy

+0

那麼,人們還可以通過簡單地調用函數來檢查接口是否在編譯時執行 - 請參閱https://stackoverflow.com/a/44692363/2969090 – Ravi