tea-e7n.dev

Go 1.27をさっくり触る

Go 1.27が正式にリリースされました

個人的に気になった部分をピックアップします。

ジェネリックメソッドのサポート

メソッドが型パラメータを持てるようになりました。 それにより、例えば以下のようなメソッドをとても自然な形で定義できるようになりました。

type List[T any] struct {
	items []T
}

func (l *List[T]) Map[U any](f func(T) U) *List[U] {
	out := make([]U, len(l.items))
	for i, v := range l.items {
		out[i] = f(v)
	}
	return &List[U]{items: out}
}

ずっと欲しいなーと思っていた仕組みなので、かなり嬉しいです。

標準ライブラリにuuidパッケージが登場

uuidの操作が標準ライブラリを利用して行えるようになりました。 これまでは独自で定義したり代替ライブラリを利用して扱う必要がありましたが、それを標準でカバーできるようになるのは嬉しいシチュエーションがありそうです。

func generate() {
	fmt.Println("=== 生成 ===")

	fmt.Println("New():  ", uuid.New())
	fmt.Println("NewV4():", uuid.NewV4())
	fmt.Println("NewV7():", uuid.NewV7())

	fmt.Println("Nil():  ", uuid.Nil()) // 00000000-0000-0000-0000-000000000000
	fmt.Println("Max():  ", uuid.Max()) // ffffffff-ffff-ffff-ffff-ffffffffffff
}

func parse() {
	sampleID := "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"

	u, _ := uuid.Parse(sampleID)
	fmt.Println(u)

	// 不正な文字列はエラー
	if _, err := uuid.Parse("not-a-uuid"); err != nil {
		fmt.Println("Parse(\"not-a-uuid\") err:", err)
	}

	// MustParse は失敗時にpanic
	known := uuid.MustParse(sampleID)
	fmt.Println("MustParse:", known)
	fmt.Println()
}

func compareAndSort() {
	a := uuid.NewV7()
	b := uuid.NewV7()
	c := uuid.NewV7()
	fmt.Println("a == b:", a == b)

	fmt.Println("a.Compare(b):", a.Compare(b))

	ids := []uuid.UUID{c, a, b}
	slices.SortFunc(ids, uuid.UUID.Compare)
}

小サイズアロケーションの高速化

個人的にこれが地味に一番すごいアップデートな気がするのですが、80バイト未満のヒープ確保速度が最大30%改善されるとのことです。

コードを変更しなくても恩恵を受けられる可能性があるのは、とても大きいです。

but the overall improvement is expected to be ~1% in real allocation-heavy programs

allocation heavyなケースではそこまで大胆に改善されることはないと記載されていますが、それでも1%程度の速度改善が見られるというのはすごいことだと思います。

まとめ

Go 1.27、だいぶアツそうです。

個人的にはジェネリックメソッドがだいぶ嬉しいのでちゃっちゃかアップデートしようと思いました。