LoginSignup
1
0

More than 1 year has passed since last update.

[Go]ジェネリクス

Posted at

概要

同じコードで様々な型のデータを処理できるようにする 機能。
動的型付け言語っぽく処理させることができる。
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、型パラメータ名が複数登場するなら、大文字一文字でそれぞれいい感じにつける」

参考

参考:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0