Generics(ジェネリクス)の使い方(comparable)

Go 1.18でGenerics(ジェネリクス)が追加されました。

Genericsを利用すると「型が異なるだけで同じ処理をもつ複数の関数」を「1つの関数」として定義することができます。

ここでは、Generics(ジェネリクス)の基本的な使い方を確認します。

動作確認用コード
( Genericsを使わない )

まず、Genericsを使わない状態のコードです。型ごとに関数を用意しています。

package main

import (
	"fmt"
)

func main() {
	stringValue := "111"
	intValue := 111
	boolValue := false

	fmt.Printf("sampleFuncString: %#v\n", sampleFuncString(stringValue))
	fmt.Printf("sampleFuncInt: %#v\n", sampleFuncInt(intValue))
	fmt.Printf("sampleFuncBool: %#v\n", sampleFuncBool(boolValue))
}

func sampleFuncString(x string) string {
	return x
}

func sampleFuncInt(x int) int {
	return x
}

func sampleFuncBool(x bool) bool {
	return x
}
sampleFuncString: "111"
sampleFuncInt: 111
sampleFuncBool: false

Genericsの使い方

comparableで型制約

以下、先述のコードをGenericsを利用して1つの関数で実装してみました。

package main

import (
	"fmt"
)

func main() {
	stringValue := "111"
	intValue := 111
	boolValue := false

	fmt.Printf("sampleFuncGenerics1: %#v\n", sampleFuncGenerics1(stringValue))
	fmt.Printf("sampleFuncGenerics1: %#v\n", sampleFuncGenerics1(intValue))
	fmt.Printf("sampleFuncGenerics1: %#v\n", sampleFuncGenerics1(boolValue))
}

func sampleFuncGenerics1[T comparable](x T) T {
	return x
}
sampleFuncGenerics1: "111"
sampleFuncGenerics1: 111
sampleFuncGenerics1: false

comparable は、型パラメータを制約したいときにだけ利用できます。

sampleFuncGenerics1 の引数に指定できる値ですが、 ==, !=演算子で比較可能な値のみになります。
以下のように、スライスなどは ==演算子 で比較不可能なので利用できません。

868-go-generics_01.png

複数の型で型制約

型パラメータを string または int だけに制約したい場合、以下のように実装できます。

package main

import (
	"fmt"
)

func main() {
	stringValue := "111"
	intValue := 111

	fmt.Printf("sampleFuncGenerics2: %#v\n", sampleFuncGenerics2(stringValue))
	fmt.Printf("sampleFuncGenerics2: %#v\n", sampleFuncGenerics2(intValue))
}

func sampleFuncGenerics2[T string | int](x T) T {
	return x
}
sampleFuncGenerics2: "111"
sampleFuncGenerics2: 111

独自インタフェースで型制約

型パラメータを string または int だけに制約したい場合、以下のようにインタフェースを定義して実装することも可能です。

package main

import (
	"fmt"
)

func main() {
	stringValue := "111"
	intValue := 111

	fmt.Printf("sampleFuncGenerics3: %#v\n", sampleFuncGenerics3(stringValue))
	fmt.Printf("sampleFuncGenerics3: %#v\n", sampleFuncGenerics3(intValue))
}

type SampleType interface {
	string | int
}

func sampleFuncGenerics3[T SampleType](x T) T {
	return x
}
sampleFuncGenerics3: "111"
sampleFuncGenerics3: 111

参考

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。

logo
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。