Go言語のジェネリックスとは何ですか
Go 言語では、ジェネリックとは、すべての型に適応するテンプレートを作成し、特に使用される場合にのみ特定の変数型を定義することを意味します。仮パラメータ型と実パラメータ型の概念を導入することで、関数は次のような処理を行うことができます。さまざまな種類のデータをプログラムする機能は、ジェネリック プログラミングと呼ばれます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 1.18 バージョンには、汎用プログラミングのサポートという新機能が追加されています。
あなたが他の言語から Go 言語に移行した開発者であれば、ジェネリックとは何か、またその使用方法は理解できますか?
しかし、Go 言語の初心者で汎用プログラミングに慣れていない人にとって、この関数は混乱するかもしれません。
この記事は、ジェネリック プログラミングに慣れていない人でも Go のジェネリックを理解し、うまく使えるようになることを願っています
Go プログラミングの一般的なガイドライン: Go プログラムは、コードを書くことで書くのではなく、コードを書くことで書く型を定義することで行う
Go プログラミングの一般原則: 型を定義するのではなく、コードを記述することによって Go プログラムを作成する
ジェネリックスとは何ですか?
ジェネリックは、すべての型に適応するテンプレートを作成し、特に使用される場合にのみ特定の変数型を定義します。
関数 仮引数と実引数
関数定義時の引数が仮引数(パラメータ)、実際に関数を使用する際に渡される引数が実引数(引数)です
加算関数があるとします。この関数には、両方とも int
型の 2 つのパラメータがあり、戻り値も int
です。これは次のように定義されます:
func Test(a,b int) int { return a + b }
渡される 2 つの実際のパラメータが両方とも int
型である場合、関数は当然ながら通常どおり実行できます。ただし、この関数は int
型の加算演算を実行するためにのみ使用できます。float64
型の加算演算も実行する必要がある場合は、別の関数を記述する必要があります。 [関連する推奨事項: Go ビデオ チュートリアル 、プログラミング教育 ]
2 種類または 3 種類の加算計算を記述するのは面倒ではなく、コピーして貼り付けるだけです。しかし、すべての計算可能な型を追加する必要がある場合、コードは十分に合理化されず、読みにくくなります。
今回は、関数がすべての計算タイプを受け取ることができる場合、計算関数を作成するのに必要なコードは 2 ~ 3 行だけであることを考えます。この機能は、関数のパラメータ定義時に特定の型を指定せずに、型の組み合わせまたはプレースホルダーを定義するだけで実現できます。
この型の組み合わせまたはプレースホルダーは型パラメーターです。型パラメーターは定義時に使用され、型引数は実際の呼び出し時に使用されます。
初期計算関数は、次のように型パラメーター関数に変換されます。
// 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 サイトに記事を公開しました。 ジェネリックを使用する場合
ジェネリックスの使用シナリオを要約すると、次のようになります。 異なる型に対してまったく同じロジックを使用してコードを作成する場合、ジェネリックスの使用が最も適切な選択です。
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)
Generic type
// MyChan Custom generics chan type
// 一个泛型通道,可用类型实参 int 或 string 实例化
type MyChan[T int | string] chan T
ログイン後にコピー型制約の宣言 (型制約)
// 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
}
ログイン後にコピープログラミング関連の知識については、プログラミング ビデオをご覧ください。 ! 以上がGo言語のジェネリックスとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
// 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 }

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

VSCODEユーザーのGolang Generic Function Typeの制約の自動削除は、VSCODEを使用してGolangコードを書くときに奇妙な問題に遭遇する可能性があります。いつ...
