はじめに
3月15日にリリースされたGo 1.18で、ついにGenericsがサポートされました(GoのGenericsについてはこちらをご覧ください)。
そこで、今回はGenericsを利用した関数の例として、汎用的に使える地味に便利な関数を紹介します。
関数の紹介
解決したいこと
Goでコードを書いていると、地味に不便だなと感じる事があります。
例えば、
1 2 3 4 5 | type User struct { name string age int email *string } |
名前と年齢が必須で、任意でメールアドレスを入力できるユーザ構造体があるとして、この構造体のインスタンスを生成する時に、
1 2 3 4 5 | user := &User{ name: "Taro", age: 20, email: &"hoge.com", } |
このように文字列を直接ポインタとして渡すことはできないため、
1 2 3 4 5 6 | email := "hoge.com" user := &User{ name: "Taro", age: 20, email: &email, } |
わざわざ、変数に代入してからその変数のポインタを渡す必要があります。
関数の内容
そこで、これを解消するために作った関数がこちらです。
1 2 3 | func ToPtr[T any](t T) *T { return &t } |
見て分かる通り非常にシンプルで、T型で渡された引数のポインタを返却します。
先程の例にこの関数を適用するとこのようになります。
1 2 3 4 5 | user := &User{ name: "Taro", age: 20, email: ToPtr("hoge.com"), } |
このように、いちいち変数への代入をしなくて良くなるので便利です。
さいごに
Go1.18から使えるようになるGenericsを使った地味に便利な関数を紹介しました。