Scala や OCaml などの他の言語で構造型付けをいじってから、Go を調べ始めました。言語間でいくつかの慣用的な手法をマッピングしようとしています。次のタイプを検討してください
type CoordinatePoint struct {
x int
y int
// Other methods and fields that aren't relevant
}
type CartesianPoint struct {
x int
y int
// Other methods and fields that aren't relevant
}
これらの型の両方を操作して極座標表現 を計算するメソッドを書きたいとしましょうfunc ConvertXYToPolar(point XYPoint) PolarPoint
。CartesianPoint
and型がandフィールドCoordinatePoint
の getter メソッドと setter メソッドを定義した場合、これらのメソッドとの共通インターフェイスとして定義でき、両方の型を操作できますが、現状では、インターフェイスはフィールドを宣言できず、メソッドのみを宣言できます。x
y
XYPoint
これに基づいて、いくつか質問があります。
- Goでこれを処理する慣用的な方法は何ですか?
- 既存のタイプを変更せずに実行できますか?
- 型の安全性を維持できますか。つまり
ConvertXYToPolar
、空のインターフェイス型をパラメーターとして使用せずに定義し、手動で変換することを回避できますか? - インターフェイスと暗黙的なインターフェイスの満足がGoのポリモーフィズムの主要なツールである場合、インターフェイス定義のフィールドの禁止は制限されていますか?
- この制限を回避するために、構造体でゲッター/セッターメソッドが一般的に定義されていますか?
- インターフェイス定義でフィールドをサポートしないという設計上の決定の背後に説得力のある理由はありますか?
組み込み型の単純さ、暗黙的なインターフェイスの満足度、インターフェイスベースのポリモーフィズムは、コードの再利用性と保守性を促進するための非常にシンプルで魅力的な手法の組み合わせであると思いますが、インターフェイス定義でフィールドを禁止すると、私の観点からは Go の構造型付け機能がいくらか制限されます. 簡単な解決策がありませんか?