ホームページ  >  記事  >  バックエンド開発  >  Go1.18 におけるジェネリックの予備調査

Go1.18 におけるジェネリックの予備調査

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 15:00:40864ブラウズ

#今日実装したい関数は、マップ内のすべての値を合計することです。

#非ジェネリック関数

ジェネリック型がない場合の実装方法?ジェネリックスを使用しない場合、値は int64、float64 などの異なる型を持つ可能性があるため、異なる型は異なる関数を通じて実装する必要があるため、通常は次のように実装します。

func SumInts(m map[string]int64) int64 {
    var s int64
    for _, v := range m {
        s += v
    }
    return s
}

func SumFloats(m map[string]float64) float64 {
    var s float64
    for _, v := range m {
        s += v
    }
    return s
}

上記のコードでは、

1. SumInts() は int64 型として値の合計を計算します; 2. SumFloats() は float64 型として値の合計を計算します;

上記の関数のみですこれは int64 および float64 型に適していますが、それでも int や float32 などを計算したい場合は、上記の関数を再コピーして型を変更する必要があります。

これを行うのは少し面倒で、コードが非常に肥大化しませんか? 言うまでもなく、以前の標準パッケージ (たとえば、Sort パッケージ (sort.go)) にも同様のコードが多数あります。さまざまな種類のスライスを実装するための標準ライブラリとして、Sorting、IntSlice、Float64Slice、StringSlice が定義されています。

以前の Go バージョンはジェネリックスをサポートしていなかったので、この方法でのみ実装できました。これは最も簡単な方法でもあります。

ジェネリックスを使用して、さまざまな型の int64 と float64 の値の合計を計算する関数を実装するにはどうすればよいでしょうか?

ジェネリック関数

#このセクションでは、ジェネリック関数を使用して、値が int64 型であるマップをパラメータとして受け取ります。値がfloat64型のマップをパラメータとして受け取ることができます。

完全なコードは次のとおりです:

func Sum[K comparable, V int64 | float64](m map[K]V "K comparable, V int64 | float64") V {
 var s V
 for _, v := range m {
  s += v
 }
 return s
}

func main() {
 ints := map[string]int64{
  "first":  1,
  "second": 2,
 }
 fmt.Println(Sum[string, int64](ints "string, int64"))

 floats := map[string]float64{
  "first":  35.98,
  "second": 26.99,
 }
 fmt.Println(Sum[string, float64](floats "string, float64"))
}

上記のコードでは、ジェネリック関数である Sum() 関数を定義しましたが、通常の関数との違いは次のとおりです。関数名と関数パラメータリストの間に角括弧 [] のセットがあります. 角括弧内には 2 つのパラメータ K と V があります. これらは Go 言語では

型パラメータ と呼ばれます. K に続くおよび V は 型の制限です。、比較可能なものは Go 言語によって事前に宣言されており、== および != 演算を実行できる任意の型を表します。 V の型制限は int64 または float64 のいずれかです。関数のパラメータは m、型はmap[K]V、戻り値の型は V です。

関数の呼び出しも通常の関数の呼び出しとは少し異なり、関数名と実際のパラメータの間に角括弧 [] があり、型名を示します。たとえば、Sum() 関数を初めて呼び出すときの型名はそれぞれ string と int64 で、その後関数が実行されるとき、対応する K と V の型はそれぞれ string と int64 になります。

第二次调用该 Sum() 函数时,K、V 的类型分别是 string 和 float64。

通过泛型编程,我们就可以实现一个函数处理多种数据类型。

执行上面的代码输出:

3
62.97

以上がGo1.18 におけるジェネリックの予備調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。