2012-10-16 11 views
6

Goでは、処理する構造体/データ型とは別にメソッドを定義することができます。メソッド定義などを配置する柔軟性を意味するだけですか?Goメソッドを構造体定義から定義する利点は何ですか?

Goの構造体/メソッドのシステムが猿のパッチ適用と比較されていると聞いたことがありますが、正しく理解すれば、メソッドは既存の型(構造体)に追加できません。タイプ。つまりとにかくあなたのコントロール下にあるタイプだけをサルにパッチすることができます。または私は何かを逃している?

タイプとそのメソッドを別々のソースファイル(または同じソースファイルの異なる部分)に定義するとしますか?

答えて

9

これは、タイプベースの言語を乗り越えるの利点である:あなたが好きなようにあなたのファイルを整理することができます

  • あなたは、一緒に多くの受信機の種類がある場合でも、
  • を全て同様の機能を置くことができます他の方法では大きすぎるファイルを分割することができます。

頻繁に、Goは役に立たない制約を追加しませんでした。だから答えは"なぜではない"かもしれない?あなたは、あなたがどの機能を決定することはできないかもしれませんができれば方法はタイプ

と同じパッケージ内に存在する必要がありますよう、あなたが本当に、任意の既存の型(構造体)にメソッドを追加することはできません

2つの異なるパッケージで同じ構造体に使用されているものと同じ関数名の場合に呼び出します。それは特定のパッケージを互換性のないものにします。

6

モンキーパッチでは行けません。メソッドを定義する型は、同じパッケージ内になければなりません。

あなたができることは、パッケージ内の好きな場所に関数とメソッドを定義することです。型の定義が型のメソッド定義と同じファイル内にあるかどうかは実際には関係ありません。

これにより、すべての型定義を1つのファイルにグループ化し、メソッドの実装を別のファイルにまとめることができます。可能であれば、メソッドによって必要とされる他のヘルパーを使用します。

7

これは(一部は、おそらく)ゴーであるため、あなたはの方法の任意タイプだけでなく、構造体を持つことができます。

type Age uint 

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

これは、既存の型にメソッドを追加する方法もあります。あなたがすることは、その既存の型に基づいて新しい型を定義し、好きなようにメソッドを追加することです。

+0

既存の型にメソッドを追加する方法はわかりません。既存の型は "uint"であり、正しく理解すれば "追加"は "uint" -sでは機能しません。 – Aivar

+0

ええ、ショートカットを取ったので、パッケージ外の型にメソッドを追加することはできませんが、既存の型に基づいて新しい型を定義し、この型にメソッドを追加できます。これらのメソッドを使用するために、基底型を拡張型にキャストするのは簡単です(たとえば、Goの作成者がソートパッケージ内のStringSlice型で行ったもの)。 – mna

関連する問題