概要
同じコードで様々な型のデータを処理できるようにする 機能。
動的型付け言語っぽく処理させることができる。
goではバージョン1.18から追加された。
関数の引数、返り値ともにその型を「型パラメータ」 + 「型パラメータリスト」で定義できる
参考
引数の型を「型パラメータ + 型パラメータリスト」で定義
一般化したコード
generaralized_argument_generics_sample.go
// [<型パラメータ名> <型パラメータの制約>]の部分が「型パラメータリスト」と呼ばれる部分
func <関数名>[<型パラメータ名> <型パラメータの制約>](<引数名> <型パラメータ名>) {
<処理>
}
具体的にジェネリクスを適用したサンプルコード
argument_generics_sample.go
package main
import "fmt"
/*
* [概要] 引数の型と値を出力する
* [引数]
* prefix: 前に挿入する接頭辞(string)
* printTarget: 型と値を出力する対象([T any])
* [詳細]
* 以下のような文字列がターミナルに出力される
* [<prefix>] 型: <printTargetの型>, 値: <printTargetの値>
*/
func PrintTypeAndValue[T any](prefix string, printTarget T) {
fmt.Printf("[%s] 型: %T, 値: %+v\n", prefix, printTarget, printTarget)
}
func main() {
intVar := 1
stringVar := "1"
float64Var := 1.1
PrintTypeAndValue("intVar", intVar)
PrintTypeAndValue("stringVar", stringVar)
PrintTypeAndValue("float64Var", float64Var)
// 上記コードを実行すると以下のように出力される
// [intVar] 型: int, 値: 1
// [stringVar] 型: string, 値: 1
// [float64Var] 型: float64, 値: 1.1
}
型パラメータの制約指定方法
以下が使える
-
any
: ガチでどんな型でもOK -
comparable
:==
と!=
が使えるすべての型 -
<型名> | <型名>...
: 自分で型指定(インターフェースを定義することでスッキリすることが可能)
参考
型パラメータ名の慣習
「型パラメータ名が1つだけ登場するならT、型パラメータ名が複数登場するなら、大文字一文字でそれぞれいい感じにつける」
参考