ホームページ >バックエンド開発 >Golang >Go でさまざまなスライス タイプのコレクションに共通の動作を定義するにはどうすればよいでしょうか?

Go でさまざまなスライス タイプのコレクションに共通の動作を定義するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 02:48:09808ブラウズ

How Can We Define Common Behavior for Collections of Different Slice Types in Go?

スライスのコレクションの共通動作の定義

この調査では、スライスのコレクション間で一貫した動作を確立するための推奨事項を求めています。半分開いた間隔で作業する例を考えてみましょう。このような間隔が 2 種類あるとします。

  • ClockInterval: 「その後午後 1 時から」など、1 日内の間隔を表します。
  • 期間: 「7 月 9 日から」など、終了が定義されていない間隔を表します。 1810 年に独立を宣言します。"

ClockInterval スライスと Period スライスの両方がコード内で頻繁に発生します。課題は、特定の時間の囲み間隔を見つける必要があるときに発生します。これには、両方の型に対して FindEnクロージングHalfOpenInterval 関数を記述する必要があり、コードの重複が発生します。

提供されたコード サンプル (https://play.golang.org/p/Cy7fFaFzYJR) は、スライス間の型変換を伴う 1 つのアプローチを示しています。ただし、複数のスライス タイプに共通の動作を定義するより効率的な方法があるかどうかという疑問が生じます。

スライスの変換

スライスを変換するための適切な方法あるタイプから別のタイプに変換するには、新しいスライスを作成し、要素を反復処理して要素を個別に変換します。変換を高速化するには、結果のスライスを事前に作成します。

func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals {
    intervals := make(HalfOpenIntervals, 0, len(clockIntervals))
    for _, clockInterval := range clockIntervals {
        intervals = append(intervals, clockInterval)
    }
    return intervals
}

コンポジション

または、コンポジションを使用してこの問題を解決することを検討してください。これには、共通の FindEntainingInterval ロジックを含む基本構造体の作成が含まれます。例:

type HalfOpenIntervalBase struct {
    intervals []HalfOpenInterval
}

func (base *HalfOpenIntervalBase) FindEnclosingInterval(time Time) HalfOpenInterval {
    // Find and return the enclosing interval using base.intervals
}

次に、この基本構造体を埋め込む ClockInterval と Period の個別の型を作成できます:

type ClockInterval struct {
    HalfOpenIntervalBase
}

type Period struct {
    HalfOpenIntervalBase
}

このアプローチを使用すると、ClockInterval と Period の両方で FindEnクロージングInterval 機能を活用できます。基本構造体から削除して、

過度の一般化

過度の一般化は逆効果になる可能性があることに注意することが重要です。コードの重複を回避する普遍的なソリューションを追求する誘惑に駆られますが、それが Go において常に最も実用的なアプローチであるとは限りません。多くの場合、さまざまなタイプのコードを複製する必要があり、最終的にはコードがよりクリーンで保守しやすくなる可能性があります。

以上がGo でさまざまなスライス タイプのコレクションに共通の動作を定義するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。