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 is the number of elements in the collection.
Len() int
// Less reports whether the element with index i
// must sort before the element with index j.
//
// If both Less(i, j) and Less(j, i) are false,
// then the elements at index i and j are considered equal.
// Sort may place equal elements in any order in the final result,
// while Stable preserves the original input order of equal elements.
//
// Less must describe a transitive ordering:
// - if both Less(i, j) and Less(j, k) are true, then Less(i, k) must be true as well.
// - if both Less(i, j) and Less(j, k) are false, then Less(i, k) must be false as well.
//
// Note that floating-point comparison (the < operator on float32 or float64 values)
// is not a transitive ordering when not-a-number (NaN) values are involved.
// See Float64Slice.Less for a correct implementation for floating-point values.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}
長い時間をかけて書いてもうまくいかず、あきらめました... もし読者の方が詳しい方がいらっしゃれば、コメント欄で教えていただけると幸いです。
早く Go 公式の詳細なジェネリックのドキュメントを見たいと思います!