ホームページ >バックエンド開発 >Golang >golangのジェネリックとは何ですか

golangのジェネリックとは何ですか

青灯夜游
青灯夜游オリジナル
2022-12-26 17:53:448732ブラウズ

golang では、ジェネリックとはプログラミング言語のスタイルまたはパラダイムであり、すべての型に適応するテンプレートを作成し、特別に使用される場合にのみ特定の変数型を定義することを意味します。ジェネリックを使用すると、プログラマーは、後で指定され、インスタンス化時にパラメーターとして指定される型を使用して、厳密に型指定されたプログラミング言語でコードを作成できます。

golangのジェネリックとは何ですか

このチュートリアルの動作環境: 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 型の加算演算も実行する必要がある場合は、別の関数

# を記述する必要があります。 ## 3種類の加算計算を書き出すのは面倒ではなく、コピペするだけです。しかし、すべての計算可能な型を追加する必要がある場合、コードは十分に簡潔ではなく、読みにくくなります。

現時点では、関数がすべての計算型を受け取ることができるかどうかを考えます。計算関数は 2 行または 3 行のコードで記述されています。この機能は、関数のパラメータを定義するときに、特定の型を指定せずに、型の組み合わせまたはプレースホルダを定義するだけで実現できます。

この型の組み合わせまたはプレースホルダが型パラメータです。定義時は型パラメータを使用します (型パラメータ) 、実際に呼び出すときは型引数 (type argument) を使用します。

初期計算関数は次のように型パラメーター関数に変換されます。

// T 是一个类型形参,在定义函数时类型是不确定的,这里的 any 是 go 泛型定义好的一组类型组合
func Test[T any](a,b T) T {
    return a + b
}
// 调用时传入类型实参,伪代码Test[int](1,2)
Test(1,2)

導入により

type 仮パラメーターの概念 および type 実パラメータ を使用すると、関数で複数の異なるタイプのデータを処理できるようになります。このプログラミング方法は、ジェネリック プログラミング

## と呼ばれます。 #なぜジェネリックなのか?前の追加例では、ジェネリックの使用に加えて、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)

ジェネリック型
// 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 ビデオ チュートリアル

プログラミング教育

]

以上がgolangのジェネリックとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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