1
Help us understand the problem. What are the problem?

posted at

Go の Genericsで作れる(たぶん)一番便利なモノを作った

注意:Generics を 使用するためには Go 1.18 以上が必要です。

有識者に怒られる覚悟で書いてます。先に謝罪しておきます。すみません。

TL;DR:一行で初期化されたポインタ作れるよ

go get github.com/ktnyt/ptr
package main

import (
	"fmt"

	"github.com/ktnyt/ptr"
)

func main() {
	p := ptr.New(42)
	fmt.Println(*p)
}

だからなんだよ

今までは Go で初期化されたポインタを作るためには最低でも二行使う必要がありました。

方法1 ポインタに値を突っ込む

p := new(int)
*p = 42

方法2 変数のアドレスを取る

i := 42
p := &i

これはつまり今までポインタを作るのに

p := func() *int { i := 42; return &i }()

的なことをしなければなりませんでした。ところが、次のような Generic 関数を定義することで

func New[T any](v T) *T {
	return &v
}
p := New(42)

とすればよくなりました。型推論が効くので型変数を書く必要もありません。最強。
https://github.com/ktnyt/ptr は自分で再生産するのが面倒なので適当に公開しただけです。各位適当に使ってらくしましょう。

主語デカすぎだろ

はい、デカいです。すみません。たぶん他にもたくさん作ってる人もいると思うんですが、まだまだGenericsは浸透していないのと初心者には届きにくい内容なのであえて主語をデカくして記事にしてみました。三行なんで適当にプロジェクト内で定義したりして使ってみてください。これが 1.18 にバージョンアップするモチベーションにもなるかもしれません(そんなことはないか)。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?