> Source: https://www.ymotongpoo.com/works/goblog-ja/go1.27/


# Go 1.27 リリース

[Go 1.27 is released](https://go.dev/blog/go1.27) by Nicholas Husin, on behalf of the Go team

本日Goチームは、Go 1.27をリリースしました。バイナリアーカイブとインストーラーは
[ダウンロードページ](https://go.dev/dl/) から入手できます。

Go 1.27では、言語、ツールチェイン、ランタイム、標準ライブラリにわたって大きな改良が加えられています。
以下ではその主なハイライトを紹介します。

## 言語の変更

Go 1.27では [言語仕様](https://go.dev/doc/go1.27#language) に3つの注目すべき更新が加えられています。

まず、ジェネリックメソッドがサポートされるようになりました。例えば
[`math/rand/v2.Rand`](https://go.dev/pkg/math/rand/v2#Rand) を見てみましょう。

```go
// Go 1.27より前は、型ごとに別々のメソッドをRandに追加する必要がありました
// (符号なし整数用のメソッドは簡潔にするため省略しています)。
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int

// Go 1.27では、すべての整数型に対して動作する新しいジェネリックメソッドが追加されました。
func (r *Rand) N[Int intType](n Int) Int
```

次に、 [構造体リテラル](https://go.dev/ref/spec#Composite_literals) 内のキーとして、その構造体型の
任意の有効な [フィールドセレクタ](https://go.dev/ref/spec#Selectors) を使えるようになり、ネストした構造体や
埋め込み構造体内のフィールドを直接初期化できるようになりました。

```go
type Habitat struct {
    Burrow string
}

type Gopher struct {
    Name    string
    Habitat // 埋め込み構造体。
}

// Go 1.27ではBurrowを直接キーとして使えます。
g := Gopher{
    Name:   "Gopher",
    Burrow: "Burrow #42",
}
```

最後に、関数の型推論がすべての代入コンテキストに適用されるよう一般化されました。ジェネリック関数を、
複合リテラル、型変換、チャネル送信の中で、明示的な型引数なしに使えるようになりました。

```go
func GenericFormatter[T any](v T) string {
    return fmt.Sprintf("value: %v", v)
}

type IntFormatter func(int) string

// Go 1.27では複合リテラル、型変換、チャネル送信においてT = intが推論されます。
formatters := []IntFormatter{GenericFormatter}
fn := IntFormatter(GenericFormatter)
ch := make(chan IntFormatter, 1)
ch <- GenericFormatter
```

## ツールの改善

* [`go fix`](https://go.dev/doc/go1.27#go-fix) には新たに複数の
  [モダナイザー](https://go.dev/pkg/golang.org/x/tools/go/analysis/passes/modernize)、すなわち
  `atomictypes`、`embedlit`、`slicesbackward`、`unsafefuncs` が追加されました。
* [`go doc`](https://go.dev/doc/go1.27#go-doc) は、`go doc example.com/pkg@v1.2.3` のような
  `package@version` 形式のクエリをサポートするようになりました。
* [`go mod tidy`](https://go.dev/doc/go1.27#go-mod-tidy) は、`go.mod` 内にある複数の `require` ブロックを、
  標準的な直接依存と間接依存の2ブロック構成に自動的に統合するようになりました。

## パフォーマンスとランタイム

* [サイズ特化型のメモリアロケーション](https://go.dev/doc/go1.27#faster-memory-allocation) により、
  小さいオブジェクト（80バイト未満）のアロケーションコストが最大30%削減され、アロケーションが
  多いプログラム全体のパフォーマンスが約1%向上します。
* [`runtime/pprof`](https://go.dev/pkg/runtime/pprof) の
  [`goroutineleak`](https://go.dev/doc/go1.27#goroutineleak-profiles) プロファイルが正式版となり、
  永続的にブロックされているゴルーチンを自動的に検出できるようになりました。

## 標準ライブラリの追加

* [`encoding/json/v2`](https://go.dev/doc/go1.27#jsonv2) は、設定可能なオプションとより厳格な
  デフォルト動作を備えた高レベルのJSON処理を提供し、あわせて低レベルのストリーミング処理向けに
  [`encoding/json/jsontext`](https://go.dev/doc/go1.27#jsonv2) も提供します。既存の
  [`encoding/json`](https://go.dev/pkg/encoding/json) パッケージは、後方互換性を保ちながら
  より高速なアンマーシャリングを実現するため、内部でv2実装を利用するようになりました。
* [`crypto/mldsa`](https://go.dev/doc/go1.27#crypto_mldsa) は、耐量子計算機暗号のML-DSA署名方式
  （FIPS 204）を実装しており、 [`crypto/x509`](https://go.dev/pkg/crypto/x509) と
  [`crypto/tls`](https://go.dev/pkg/crypto/tls) に統合されています。
* [`uuid`](https://go.dev/doc/go1.27#uuid) は、UUIDの生成とパースをネイティブにサポートします。
* [`simd`](https://go.dev/doc/go1.27#simd) とアーキテクチャ固有の
  [`simd/archsimd`](https://go.dev/doc/go1.27#archsimd) は、実験的なSIMDサポートを提供します。
* [`net/http/httptest`](https://go.dev/doc/go1.27#nethttphttptestpkgnethttphttptest) には
  [`NewTestServer`](https://go.dev/pkg/net/http/httptest#NewTestServer) が追加され、
  [`testing/synctest`](https://go.dev/pkg/testing/synctest) パッケージと組み合わせて使うのに適した
  インメモリの疑似ネットワークを提供します。

変更点の完全な一覧と詳細については、 [Go 1.27リリースノート](https://go.dev/doc/go1.27) を
お読みください。

今後数週間にわたって、Go 1.27に関連するトピックのいくつかをより詳しく扱ったブログ記事が
続きます。ぜひまた読みに来てください。

コードを書き、バグを報告し、実験的な追加機能を試し、リリース候補をテストすることでこのリリースに
貢献してくださったすべての方に感謝します。いつものように、何か問題に気づいた場合は
[issueを立てて](https://go.dev/issue/new) ください。

Go 1.27を楽しんでお使いください！

By Nicholas Husin, on behalf of the Go team

