golang のジェネリックスとは、すべての型に適応するテンプレートを作成することを意味します。特定の変数の型は、特別に使用される場合にのみ定義されます。ジェネリックスは、プログラミング言語のスタイルまたはパラダイムです。ジェネリックスを使用すると、プログラマはコードで厳密に型指定されたプログラムを使用できます。後で指定され、インスタンス化中にパラメーターとして指定される型を使用する設計言語で。異なる型に対してまったく同じロジックを使用してコードを作成する場合、ジェネリックを使用することが最も適切な選択です。
このチュートリアルの動作環境: Windows 10 システム、go1.20.1 バージョン、Dell G3 コンピューター。
ジェネリックとは何ですか?
ジェネリックとは、すべての型に適応するテンプレートを作成し、特に使用される場合にのみ特定の変数の型を定義することを意味します。
ジェネリックとは、プログラミング言語のスタイルまたはパラダイムです。ジェネリックを使用すると、プログラマーは、後で指定され、インスタンス化時にパラメーターとして指定される型を使用して、厳密に型指定されたプログラミング言語でコードを作成できます。
関数の仮引数と実引数
関数定義時の引数が仮引数(パラメータ)、関数定義時に渡される引数が仮引数(パラメータ)です。実際に使用するのは実パラメータ (引数) )
加算関数があるとします。この関数の 2 つのパラメータは両方とも int 型で、戻り値も int です。定義は次のとおりです。
func Test(a,b int) int { return a + b }
// T 是一个类型形参,在定义函数时类型是不确定的,这里的 any 是 go 泛型定义好的一组类型组合 func Test[T any](a,b T) T { return a + b } // 调用时传入类型实参,伪代码Test[int](1,2) Test(1,2)
前の追加の例では、次のようになります。ジェネリックスの使用に加えて、Go のインターフェイス リフレクションを通じて動的データ型処理を実装することもできます。ジェネリクスが実現できる機能も、基本的にはインターフェースのリフレクションによって実現できますが、リフレクションを使ったことがある人ならわかると思いますが、リフレクションの仕組みには多くの問題点があります。コンパイル時間が失われます。型チェックがあり、バグが発生しやすく、パフォーマンスが低下します。
しかし、すべてのシナリオでジェネリックスが使用されているとは言えません。ジェネリックスは万能薬ではありません。ジェネリックスには、対応する適用可能なシナリオがあります。Go ジェネリック デザイナーについて読むことができます。 Ian Lance Taylor は、ジェネリクスをいつ使用するかに関する記事を公式ブログ Web サイトに公開しました。
ジェネリクスの使用シナリオを 1 つの文で要約しています: 異なる型に対してまったく同じロジックでコードを記述する場合は、ジェネリックスを使用するのが最適ですオプションです。適切な選択です。
Go ジェネリックの例
ジェネリック関数
// Add sums the values of T. It supports string, int, int64 and float64 // // @Description A simple additive generic function // @Description 一个简单的加法泛型函数 // @parameter a, b T string | int | int64 | float64 "generics parameter" // @return c T string | int | int64 | float64 "generics return" func Add[T string | int | int64 | float64](a, b T) T { return a + b } // 使用 Add(1, 2) Add(1.0,2.0)
// MyChan Custom generics chan type // 一个泛型通道,可用类型实参 int 或 string 实例化 type MyChan[T int | string] chan T
宣言型の制限 (型制約)
Go の型制約はインターフェイスを通じて実装されます// CustomizationGenerics custom generics
//
// @Description custom generics, which are type restrictions
// @Description ~is a new symbol added to Go 1.18, and the ~ indicates that the underlying type is all types of T. ~ is pronounced astilde in English
// @Description 自定义泛型,即类型限制
// @Desciption ~ 是 Go 1.18 新增的符号,~ 表示底层类型是T的所有类型。~ 的英文读作 tilde
//
// @Example With the addition of ~, MyInt can be used, otherwise there will be type mismatch
// @Example 加上 ~,那么 MyInt 自定义的类型能够被使用,否则会类型不匹配
type CustomizationGenerics interface {
~int | ~int64
}
以上がgolang でジェネリックとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。