Golang ジェネリックの例

Golang Jenerikkuno Li



Golang のジェネリック機能を使用すると、タイプセーフで幅広い型と互換性のある再利用可能なコードを作成できます。幸いなことに、Go へのジェネリックスの追加により、コードの再利用と柔軟性のための新しい道が開かれます。 Golang の最新バージョンでは、待望のジェネリックスのサポートが導入されました。

さらに重要なのは、ジェネリックスは Go の強力な型安全性を維持し、コンパイル時の静的型チェックを可能にし、型の正確性を保証します。これらは汎用コード内で標準化されたエラー処理を提供し、明確さと保守性を向上させます。さらに、汎用コード内で標準化されたエラー処理が提供され、明確さと保守性が向上します。この投稿では、いくつかの実際の G​​o ジェネリック アプリケーションと例を検討します。

例 1: Golang 汎用関数の使用

ジェネリックの主な使用例の 1 つは、個別の型を操作できる関数を作成することです。ここでは、一般的な円周関数が使用される例の 1 つを使用します。







パッケージ 主要
輸入 「fmt」
機能 [ r 整数 | float32 ]( 半径r ) {
c := 3 * 2 * 半径
fmt プリントイン ( 「一般的な円周は次のとおりです。」 c )
}
機能 主要 () {
だった r1 整数 = 7
だった r2 float32 = 7 5
( r1 )
( r2 )
}

前のコードの先頭で、この行は、出力をコンソールに出力するなど、フォーマットされた I/O の機能を提供する「fmt」パッケージをインポートします。次に、「int」または「float32」のいずれかのジェネリック型「r」のパラメータ半径を取る「circumference」という名前のジェネリック関数を定義します。関数内では、半径に定数値「3」を乗算し、さらに「2」を乗算して円周を計算します。最後に、「fmt.Println」を使用して計算された円周を印刷します。



次に、2 つの変数 r1 と r2 が宣言され、それぞれ 7 と 7.5 の値が割り当てられている main 関数があります。その後、r1 と r2 を引数として渡して、「周囲」関数が 2 回呼び出されます。



出力には、次の円の円周を出力することによって計算が表示されます。





例 2: Golang 汎用インターフェイスの使用

さらに、Golang ジェネリックはインターフェイスを支援します。 Go のインターフェイスは、コードの再利用とポリモーフィズムを促進するための重要なツールです。ジェネリックは多くの型で機能できるようにすることで、インターフェイスの能力を高めます。以下は、Golang ジェネリックス インターフェイスのソース コードです。



パッケージ 主要
輸入 「fmt」
タイプ 雇用 インターフェース {
int64 | int32 | float32 | float64
}
機能 newGenericFunc [ 年齢 年齢 ]( emp_Age 年齢 ) {
ヴァル := 整数 ( emp_年齢 ) + 1
fmt プリントイン ( ヴァル )
}
機能 主要 () {
fmt プリントイン ( 「社員の年齢」 )
だった 1歳 int64 = 24
だった 2歳 float64 = 25 5
newGenericFunc ( 1歳 )
newGenericFunc ( 2歳 )
}

前のソース コードでは、従業員の年齢に使用できるタイプを指定する「EmpAge」という名前のインターフェイスを定義しました。インターフェイスには、int64、int32、float32、および float64 型が含まれます。このインターフェイスにより、「ジェネリック」関数はこれらの型のいずれかを引数として受け入れることができます。その後、newGenericFunc という名前のジェネリック関数を使用します。この関数は、EmpAge インターフェイスを満たす任意のタイプの age のジェネリック型の emp_Age パラメータを受け取ります。関数内では、示されているように、emp_Age を int に変換し、1 ずつインクリメントします。

次に、2 つの変数 Age1 と Age2 を宣言し、main 関数でそれぞれ 24 と 25.5 の値を割り当てます。その後、Age1 と Age2 がパラメータとして newGenericFunc 関数に渡され、2 回実行されます。これにより、年齢が 1 つ増えて更新された値が生成されます。

以下で得られる出力は、インターフェイスを利用する汎用関数からの経過時間です。

例 3: Golang の汎用データ構造の使用

さらに、Go ジェネリックにより、スタック、キュー、リンク リストなどの汎用データ構造を構築する機能も提供されます。以下の汎用スタックの実装を検討してください。

輸入 「fmt」
タイプ スタック [ どれも ] [] T
機能 ( セント * スタック [ T ]) 押す ( アイテムT ) {
セント = 追加する ( * セント アイテム )
}
機能 ( セント * スタック [ T ]) ポップ () T {
もしも それだけ ( * セント ) == 0 {
パニック ( 「スタックには何もありません」 )
}
索引 := それだけ ( * セント ) - 1
アイテム := ( * セント )[ 索引 ]
* セント = ( * セント )[: 索引 ]
戻る アイテム
}
機能 主要 () {
スタック := 新しい ( スタック [ 整数 ])
スタック 押す ( 1 )
スタック 押す ( 2 )
スタック 押す ( 3 )
fmt プリントイン ( スタック ポップ ())
fmt プリントイン ( スタック ポップ ())
fmt プリントイン ( スタック ポップ ())
}

前のコードでは、スタックを表す「Stack」という名前のジェネリック型が定義されています。 「T」プレースホルダーを使用すると、スタックが任意の型の要素を保持できるようになります。 「スタック」タイプは、タイプ「T」の要素のスライスとして実装されます。ここでは、「Stack」タイプに「Push」と「Pop」の 2 つの機能を展開します。 Push() 関数は、要素をスタックに追加する役割を果たします。これはタイプ「T」の引数項目を受け取り、append() 関数を使用してそれを基礎となるスライスに追加します。

Pop() 関数はスタックから初期コンポーネントを取得して返しますが、まず基礎となるスライスのサイズを評価することでスタックが空かどうかを判断します。スタックが空であるように見える場合は、エラー通知が送信され、パニックが発生します。それ以外の場合は、スライスから最後の要素を取得し、スライスを最後から 2 番目の要素までスライスしてスタックから削除し、削除された項目を返します。

次に、このコードの main 関数内で Stack[int] 構文を使用して、整数の新しいスタックが作成されます。その後、「Push」メソッドが 3 回呼び出され、整数 1、2、および 3 がスタックに追加されます。ただし、「Pop」メソッドはその後 3 回呼び出され、スタックから要素を取得して出力します。

次の出力は、要素が逆の順序でスタックから削除されることを示しています。

例 4: Golang の汎用制約の使用

Go は、優れた柔軟性を実現し、アプリケーションのニーズに基づいて汎用構造の特定の要件を定義するカスタム制約も提供します。カスタムの汎用制約のコードは、デモ用に以下に提供されています。

パッケージ 主要
輸入 「fmt」
タイプ 数値 インターフェース {
int64 | float64
}
機能 主要 () {
FloatValue := [] float64 { 2 0 4 0 6 0 8 0 10 0 }
整数値 := [] int64 { 2 4 6 8 10 }
合計1 := 一般的な合計 ( FloatValue )
合計2 := 一般的な合計 ( 整数値
fmt プリントイン ( 「float64 の合計:」 合計1 )
fmt プリントイン ( 「int64 の合計:」 合計2 )

}
機能 一般的な合計 [ n 数値 ]( 数字 [] n ) n {
だった 私はnです
ために _ 1つで := 範囲 数字 {
+= 1つで
}
戻る
}

前のソース コードでは、「Sum」メソッドを使用して Numerics インターフェイスを定義しています。次に、2 つのカスタム タイプ「FloatValue」と「IntegerValue」を作成します。これらは、それぞれの「Sum」メソッドを提供することで Numerics インターフェイスを実装します。 genericSum 関数は、Numerics インターフェースを満たす任意のタイプのスライスを受け入れることができるようになりました。関数内で要素を反復処理し、「Sum」メソッドを呼び出して合計を計算します。最後に、main 関数で FloatValue と IntegerValue のスライスを作成し、それらを genericSum() 関数に渡します。この関数は、各スライスの要素の合計を正しく計算します。

予想される出力が次の画面に表示されます。

結論

ジェネリック データ構造とジェネリック関数の作成、ジェネリック インターフェイスの定義、カスタム型制約の使用など、Go ジェネリックの実用的な例をいくつか検討しました。これらの例は、ジェネリックが Go プログラミング言語にもたらす能力と柔軟性を示しています。コンパイル中のジェネリック コード生成により、効率的なバイナリ サイズとコンパイル時間が保証されることに注意してください。