6

Goを使用すると、メソッドを操作する構造体/データ型とは別にメソッドを定義できます。それは、メソッド定義などを配置する際の柔軟性を意味するのでしょうか。

Goの構造体/メソッドシステムがモンキーパッチと比較されていると聞きましたが、正しく理解していれば、メソッドは型と同じパッケージに存在する必要があるため、既存の型(構造体)にメソッドを追加することはできません。つまり。とにかくあなたのコントロール下にあるタイプだけにモンキーパッチを当てることができます。それとも私は何かが足りないのですか?

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

4

3 に答える 3

10

これは、タイプベースの言語を超えることの利点です。ファイルを好きなように整理できます。

  • 受信機の種類が多い場合でも、同様の機能をすべてまとめることができます
  • さもなければ大きすぎるファイルを分割することができます

よくあることですが、Goは役に立たない制約を追加しませんでした。それで、答えは「なぜそうではない」かもしれませんか?

メソッドはタイプと同じパッケージに存在する必要があるため、既存のタイプ(構造体)にメソッドを追加することはできません。

可能であれば、2つの異なるパッケージの同じ構造体で同じ関数名が使用されている場合に、どの関数を呼び出すかを決定できない可能性があります。または、特定のパッケージに互換性がなくなります。

于 2012-10-16T10:57:21.893 に答える
7

これは(おそらく)Goでは、構造体だけでなく、任意のタイプのメソッドを持つことができるためです。

type Age uint

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

これは、既存のタイプにメソッドを追加する方法でもあります。その既存の型に基づいて新しい型を定義し、必要に応じてメソッドを追加します。

于 2012-10-16T12:50:07.633 に答える
6

モンキーパッチは外出先ではできません。メソッドを定義するタイプは、同じパッケージに存在する必要があります。

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

これにより、すべての型定義を1つのファイルにグループ化し、メソッドを別のファイルに実装することができます。おそらく、メソッドで必要とされる他のヘルパーと一緒に。

于 2012-10-16T10:59:20.667 に答える