Go チームは 12 月 14 日に Go 1.18 Beta 1 をリリースし、ジェネリックのサポートを正式に導入しました。詳細はThe Go Blogを参照してください。筆者も最近、新機能を試してみました。
ダウンロードとインストール#
公式ドキュメントに従ってベータ版をダウンロードしてインストールします:
❯ go install golang.org/dl/go1.18beta1@latest
# 注:以下の実行可能ファイルは$GOPATH/binにあります。環境変数が設定されていない場合は、パスを手動で指定する必要があります
❯ go1.18beta1 download
❯ go1.18beta1 version
go version go1.18beta1 linux/amd64
インストールが完了しました!
簡単な体験#
公式のジェネリックのドキュメントを参考に、任意の加算可能なスライスの要素を合計するメソッドを簡単に作成できます:
Go のツールチェーンはまだ新しい構文に対応していないため、VSCode は構文エラーを表示しますが、実際の実行結果は期待どおりです。
より深く理解する#
多くの人が Go の新しいジェネリックの構文と使い方についてさらに理解したいと思っているでしょうが、残念ながら公式ドキュメントには前述の簡単なドキュメントしか提供されていません。現時点では、いくつかのサードパーティのジェネリックの例を見つけることができました。興味がある方は、コードを読んで理解を深めることができます。
個人的な感想#
おそらくドキュメントの不足のため、例だけではジェネリックの実際の用途を想像するのは難しいです。ジェネリックを手に入れた後、最初に試してみたかったのは、複数の型のスライスをソートすることです。つまり、sort.Interface
を一括で実装することです:
type Interface interface {
// コレクション内の要素の数です。
Len() int
// インデックスiの要素がインデックスjの要素よりも前にソートされる必要があるかどうかを報告します。
//
// Less(i, j)とLess(j, i)の両方がfalseの場合、インデックスiとjの要素は等しいと見なされます。
// Sortは、等しい要素を最終結果の任意の順序で配置する場合がありますが、Stableは等しい要素の元の入力順序を保持します。
//
// Lessは推移的な順序を記述する必要があります:
// - Less(i, j)とLess(j, k)の両方がtrueの場合、Less(i, k)もtrueである必要があります。
// - Less(i, j)とLess(j, k)の両方がfalseの場合、Less(i, k)もfalseである必要があります。
//
// 浮動小数点数の比較(float32またはfloat64の値の<演算子)は、
// NaN(非数)の値が関与する場合には推移的な順序ではありません。
// 浮動小数点数の値に対する正しい実装については、Float64Slice.Lessを参照してください。
Less(i, j int) bool
// インデックスiとjの要素を交換します。
Swap(i, j int)
}
長い時間をかけて書いてもうまくいかず、諦めました... もし読者の方が知っている場合は、コメント欄で教えていただけると幸いです。
早く Go 公式の詳細なジェネリックのドキュメントを見たいです!