2012-10-16 43 views
6

Go允許我們從它們工作的struct/datatype中分別定義方法。這是否意味着放置方法定義或其他更多的靈活性?遠離結構定義定義Go方法有什麼好處?

我聽說Go的結構/方法系統與猴子補丁相比,但如果我理解正確,那麼你實際上不能將方法添加到任何現有類型(結構),因爲方法必須與類型。 IE瀏覽器。無論如何,你只能修補你所控制的類型。或者我錯過了什麼?

在哪些情況下,您會在單獨的源文件(或同一源文件的不同部分)中定義類型及其方法?

回答

9

這是圍棋在基於類型語言的優勢:你可以組織你的文件,只要你喜歡:

  • ,你可以把所有的類似的功能結合在一起,即使有很多接收機類型
  • 你可以拆分否則太大

頻繁文件,轉到未加約束這是無用的。所以答案也可能是「爲什麼不」

你真的不能添加方法到任何現有的類型(結構),作爲方法必須駐留在同一個封裝類型

如果你能,你可能不能夠確定哪些功能在兩個不同包中的相同結構中使用相同函數名的情況下調用。否則會使某些軟件包不兼容。

6

猴子補丁是不可能的。您定義方法的類型必須位於相同的包中。

你可以做的是定義函數和方法,無論你喜歡在包內。如果類型定義與該類型的方法定義位於同一文件中,則無關緊要。

這使得可以將所有類型定義分組到一個文件中,並使方法在另一個文件中實現。可能與方法所需的其他助手一起使用。

7

這是(部分,很可能),因爲在圍棋,你可以有任何類型,不僅僅是結構上方法:

type Age uint 

func (a Age) Add(n Age) Age { 
    return a + n 
} 

這也是你如何添加方法,以現有的類型。你所做的是根據現有類型定義一個新類型,並根據需要添加方法。

+0

我不明白它是如何將方法添加到現有類型的 - 現有類型是「uint」,如果我理解正確,「添加」將不適用於「uint」-s。 – Aivar

+0

是的,我使用了一個快捷方式,不能將方法添加到包之外的類型,但是可以基於現有類型定義新類型,併爲此類型添加方法。然後將基類型轉換爲擴展類型以使用這些方法(例如,Go作者對排序包中的StringSlice類型所做的操作)是很簡單的。 – mna