2012-06-15 20 views
1

Go語言將接口類型作爲特徵,類似於C風格的接口。但是,Go的界面類型似乎並沒有被強制執行 - 它們僅僅定義了協議,而沒有實際應用於類型。由於它們沒有被強制執行,使用接口還是個好主意嗎?如果Go的接口沒有被強制執行,它們是否有必要?

+5

你是什麼意思的「執行」?值必須實現一個接口才能分配給它,並且這由類型檢查器強制執行。你不必聲明一個類型實現了一個接口,但這是通過設計,而不是一個問題。 – SteveMcQwark

+5

什麼是「C風格的界面」?你的意思是Go不「強制」接口? Go編譯器肯定會強制,當你將一個類型傳遞給一個接受某個接口的函數時,該接口就會實現,它在編譯時靜態地完成這個工作,這也是使Go變得更好的原因之一。 – uriel

+0

-1:這個問題是基於Go的接口沒有被強制執行的錯誤概念。 http://play.golang.org/p/V65p3FMvPO – weberc2

回答

7

是的。 Go不允許構建類型層次結構,因此接口對於允許某些多態性非常重要。考慮在封裝sort定義的sort.Interface

type Interface interface { 
    // Len is the number of elements in the collection. 
    Len() int 
    // Less returns whether the element with index i should sort 
    // before the element with index j. 
    Less(i, j int) bool 
    // Swap swaps the elements with indexes i and j. 
    Swap(i, j int) 
} 

sort包中包含的功能sort(data Interface)一個期望實現該接口的任何對象。沒有接口,這種形式的多態將不可能實現。事實上,你不必顯式註釋你的類型實現了這個接口,是無關緊要的。

關於go的一個很酷的部分是,你甚至可以在原始類型上實現這個接口,只要類型是在同一個包中定義的。所以,下面的代碼定義整數數組排序:

type Sequence []int 

// Methods required by sort.Interface. 
func (s Sequence) Len() int { 
    return len(s) 
} 
func (s Sequence) Less(i, j int) bool { 
    return s[i] < s[j] 
} 
func (s Sequence) Swap(i, j int) { 
    s[i], s[j] = s[j], s[i] 
} 
+4

「你甚至可以在原始類型上實現這個接口」你的意思是你可以定義自定義類型的方法,這可能在結構上等於原始類型。 'Sequence'和'[] int'是不同的類型。 – newacct

+0

難道你不能在'[] int'而不是'Sequence'上定義那些相同的方法並且實際完成OA的目標嗎?或者你不能爲基元類型編寫新的方法。 – matthias

+0

mathias:在一年以後隨機查看,但不是,無法在基本類型上定義新方法。 – twotwotwo

0

我希望知道類型檢查,既靜和在運行時是什麼,但我不知道什麼是「強制的接口」。

相關問題