見出し画像

golang ジェネリクスの使い方と制約について

今回はgolangのジェネリクスについて解説していきます。

ジェネリクス

ジェネリクスはGo 1.18で新たに導入された比較的新しい機能です。
ジェネリクスを使うことにより、異なる型で再利用可能な関数や型を書くことができます。つまり型の安全性を保ちつつ、コードの重複を減らすことができます。


ジェネリクスの使い方

ジェネリクスを使には型パラメータリストを関数や型に追加します。
リストは角括弧([])内に定義され、各パラメータは大文字で始まる識別子にします。

package main

import (
    "fmt"
)

func Print[T any](s []T) {
    for _, v := range s {
        fmt.Println(v)
    }
}

func main() {
    ints := []int{1, 2, 3, 4}
    Print(ints)

    strings := []string{"hello", "world"}
    Print(strings)
}

Print関数はジェネリック関数で型パラメータTを持ちます。
[T any]はTが任意の型(any)を表すことを意味していて、Print関数は任意の型のスライスを受け取ることができます。
関数内のforループはスライスsの各要素を繰り返し処理し、fmt.Printlnを使ってそれぞれの要素を標準出力に表示します。

次にstring型の要素を持つスライスstringsを作成し、同じくPrint関数に渡しています。これにより、各文字列が出力されます。

同じ関数Printが異なる型のスライスで再利用されており、型安全性を保ちながら汎用的な操作をすることができます。

また、ジェネリクスのパラメータには制約を設定することができます。
これにより特定のインターフェースを実装する型のみを許可することができます。

package main

type Adder[T Number] interface {
    Add(T, T) T
}

type Number interface {
    ~int | ~float64
}

func Add[T Number](a, b T) T {
    return a + b
}

Adderというジェネリックインターフェースを定義しています。
Tは型パラメータで、Numberインターフェースによって制約されています。
Add(T, T) Tは、Adderインターフェースの中で定義された唯一のメソッドで、2つのT型の引数を受け取りT型の結果を返します。

Numberは型パラメータに適用されるインターフェースで、int型とfloat64型にマッチするように制約を設定しています。
~は型セットを意味し、この場合はintとfloat64の基本型またはそれらの型と同一の型を意味します。

Add関数はジェネリック関数で型パラメータTに対してNumberインターフェースの制約を適用しています。
この関数は2つのT型の値を受け取り、それらを加算して結果を返します。この関数はintやfloat64のような数値型で動作します。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。

この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?