---
title: "Go 1.27の新機能・変更点まとめ｜Goの最新バージョンは1.27、確認・更新方法と移行の注意点"
url: "https://www.issoh.co.jp/tech/details/10416/"
published: 2025-12-26
updated: 2026-10-26
categories: ["Go"]
publisher: "株式会社一創"
---

# Go 1.27の新機能・変更点まとめ｜Goの最新バージョンは1.27、確認・更新方法と移行の注意点

Go 1.27は2026年8月19日に正式リリースされました。2026年10月26日時点の最新パッチはgo1.27.3（2026年10月19日公開）で、1つ前の系列のgo1.26.10も同日に出ています。この記事では、Go 1.27で入った言語・標準ライブラリ・ランタイムの変更と、最新版の確認・更新手順をまとめます。go1.27.3とgo1.26.10を手元で動かし、1.26から上げたときに実際に止まる箇所をエラー文つきで載せました。

## まとめ：Go 1.27と最新バージョンの要点

- **最新バージョン**：Go 1.27系の最新はgo1.27.3（2026-10-19）。サポート中は1.27系と1.26系の2本で、Go 1.25は1.27.0の公開でサポートを終えた。
- **確認方法**：手元は `go version`、公式の最新は `go list -m go@latest` か `https://go.dev/dl/?mode=json` で引ける。
- **言語**：メソッドが独自の型パラメータを持てるジェネリックメソッド、埋め込みフィールドを構造体リテラルのキーに直接書ける変更、関数型推論の一般化の3点。
- **標準ライブラリ**：`encoding/json/v2` が正式に入り、既存の `encoding/json` も内部はv2実装に置き換わった。`uuid` と `crypto/mldsa` が新設。
- **上げるときに止まる箇所**：go.modの `go` 行、`go test` の `stdversion` 検査、削除されたGODEBUGの古い値。macOS 13以上が必須。

## Goの最新バージョンとリリース履歴

Goは2月と8月の年2回メジャーリリースを出し、その間に月1回前後のパッチ版を出します。公式の[Release History](https://go.dev/doc/devel/release)によると、直近の公開は次のとおりです。

| バージョン     | 公開日        | 主な内容                                 |
| --------- | ---------- | ------------------------------------ |
| go1.27.3  | 2026-10-19 | crypto/x509のセキュリティ修正                 |
| go1.27.2  | 2026-10-08 | goコマンド・crypto/tls・net/http等のセキュリティ修正 |
| go1.27.1  | 2026-09-01 | cgo・コンパイラ・encoding/json等のバグ修正        |
| go1.27.0  | 2026-08-19 | メジャーリリース                             |
| go1.26.10 | 2026-10-19 | crypto/x509のセキュリティ修正                 |
| go1.26.0  | 2026-02-10 | メジャーリリース                             |
| go1.25.14 | 2026-08-19 | 1.25系の最終パッチ                          |

サポート方針は「各メジャーリリースは、新しいメジャーリリースが2つ出るまでサポートする」です。1.27.0の公開で1.25はサポートを外れ、1.25.14が最後のパッチになりました。今1.25以前を使っているなら、セキュリティ修正が出ない状態なので1.26か1.27へ上げます。1.25の変更点は[Go 1.25の新機能と変更点の記事](/tech/details/8421/)にまとめています。次のGo 1.28は2027年2月の予定です。

## Goの最新バージョンを確認・更新する手順

### 手元と公式の最新版を確認するコマンド

手元のバージョンは `go version` で出ます。公式の最新版は、goコマンドだけで `go list -m go@latest` を実行すると取れます。2026年10月26日の実行結果は次のとおりでした。

```
$ go version
go version go1.27.2 darwin/amd64
$ go list -m go@latest
go 1.27.3
$ curl -s 'https://go.dev/dl/?mode=json' | jq -r '.[].version'
go1.27.3
go1.26.10
```

`?mode=json` はサポート中の安定版だけを返すため、CIでサポート対象系列と最新パッチを確認する用途に向きます。ただし、返るのは各系列の最新パッチなので、使用版との完全一致だけで系列のサポート切れを判定しないでください。ビルド済みバイナリがどの版で作られたかは `go version ./app` で確認できます。

### go.modのgo行・toolchain行による更新と適用範囲

Go 1.21以降は、go.modが現在の既定ツールチェーンより新しい版を要求すると、必要なツールチェーンをPATHから探し、なければ取得して切り替えます（`GOTOOLCHAIN=auto` が既定）。go1.27.2が入った環境で、`go 1.26.0` のモジュールに次の2通りを試しました。

```
$ go get go@1.27.3
go: updating go.mod requires go >= 1.27.3; switching to go1.27.3
go: upgraded go 1.26.0 => 1.27.3

$ go get toolchain@go1.27.3
go: added toolchain go1.27.3
```

違いは言語版です。`go get go@1.27.3` は `go` 行を上げるのでジェネリックメソッドなど1.27の言語機能が有効になり、後述の検査も1.27基準に変わります。`toolchain` 行だけを足すと、ビルドに使うツールチェーンはgo1.27.3になる一方、言語版は1.26のままです。まずツールチェーンだけ上げてパッチのセキュリティ修正を取り込み、`go` 行は検証が済んでから上げる、という2段階にできます。仕組みは[GOTOOLCHAINでバージョンを自動切り替えする記事](/tech/details/5635/)で詳しく扱っています。

### インストーラ・DockerイメージによるGoの更新

マシンに入れるGo本体は、[go.dev/dl](https://go.dev/dl/)のインストーラで上書きするか、`go install golang.org/dl/go1.27.3@latest` のあと `go1.27.3 download` で別名のコマンドとして並べて入れます。Docker Hubの公式イメージには `golang:1.27`、`golang:1.27.3-bookworm`、`golang:1.27-trixie`、`golang:1.27-alpine` などのタグがあります。`golang:1.27-rc` 系のタグも残っていますが、正式版が出た今は使う理由がありません。CIでは `1.27.3-bookworm` のようにGoのパッチ版とOS系列を固定します。同じタグでもイメージは更新されるため、厳密な再現性が必要ならdigestも固定し、セキュリティ更新に合わせて見直します。

## Go 1.27の言語仕様の変更：ジェネリックメソッドほか3点

[Go 1.27のリリースノート](https://go.dev/doc/go1.27)が挙げる言語変更は3つです。go1.27.3で次のコードを実行し、3点とも動くことを確かめました。

```
package main

import (
	"fmt"
	"strconv"
)

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

// ジェネリックメソッド：レシーバのTとは別にUを宣言できる
func (l List[T]) Map[U any](f func(T) U) List[U] {
	out := make([]U, 0, len(l.items))
	for _, v := range l.items {
		out = append(out, f(v))
	}
	return List[U]{items: out}
}

type Habitat struct{ Burrow string }
type Gopher struct {
	Name string
	Habitat
}

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

type IntFormatter func(int) string

func main() {
	s := List[int]{items: []int{1, 2, 3}}.Map(strconv.Itoa)
	fmt.Printf("%q\n", s.items)                       // ["1" "2" "3"]
	g := Gopher{Name: "Gopher", Burrow: "Burrow #42"} // 埋め込み先のフィールドを直接指定
	fmt.Println(g.Burrow)
	fs := []IntFormatter{Format} // 型引数を書かずに代入できる
	fmt.Println(fs[0](7))        // value: 7
}
```

ジェネリックメソッドには制約が1つあります。インターフェースのメソッドは型パラメータを持てず、ジェネリックメソッドでインターフェースを実装することもできません。インターフェースに書くと `interface method must have no type parameters` でコンパイルが止まります。標準ライブラリでは `math/rand/v2` の `Rand` に、全整数型で使えるメソッド `N` が追加されました。

## Go 1.27の標準ライブラリの追加：encoding/json/v2・uuid・crypto/mldsa

### encoding/json/v2とv1の既定の違い

`encoding/json/v2` と低レベル処理の `encoding/json/jsontext` が正式に入り、既存の `encoding/json` も内部はv2実装で動くようになりました。v1の挙動は保たれ、リリースノートは「v1 APIは引き続きサポートされ、移行は必須ではない」としています。v2を直接使うと既定値が厳しくなります。go1.27.3で同じ入力を両方に通した結果です。

| 入力                           | v1（encoding/json） | v2（既定）                           |
| ---------------------------- | ----------------- | -------------------------------- |
| 重複キー {“name”:”a”,”name”:”b”} | 後勝ちで “b”          | duplicate object member name エラー |
| 不正なUTF-8                     | U+FFFDに置換         | invalid UTF-8 エラー                |
| {“NAME”:”x”} を name へ        | 大小文字を無視して “x”     | 一致せず空文字                          |
| nilスライスの出力                   | null              | \[\]                             |
| mapの出力順                      | キー順               | 順不同（Deterministicで固定）            |

v2のAPIを使いながらv1と同じ結果にしたいときは、v1側にある `json.DefaultOptionsV1()` をv2の `Marshal` に渡します（実測でnilスライスが `null` に戻りました）。この関数は `encoding/json/v2` ではなく `encoding/json` のパッケージにあります。既存コードの互換問題で旧実装に戻すなら `GOEXPERIMENT=nojsonv2` を付けてビルドしますが、このとき `encoding/json/v2` をimportしているパッケージは `build constraints exclude all Go files` でビルドできなくなります。v2を使い始めたコードでは逃げ道にならない点に注意してください。

### uuidパッケージとUUIDv7

標準ライブラリに `uuid` パッケージ（RFC 9562準拠）が入り、`New`・`NewV4`・`NewV7`・`Parse`・`MustParse`・`Compare` などが使えます。`go doc uuid.New` の説明は「現時点では `NewV4` と同じ」です。主キーに時刻順のIDを使いたいなら `NewV7` を明示します。連続して生成したUUIDv7を `Compare` で比べると -1（生成順）になりました。UUIDv7の構造とDBでの使い方は[UUIDv7とUUIDv4の違いの記事](/tech/details/11650/)を参照してください。

### crypto/mldsa・simdとそのほかの追加

`crypto/mldsa` はFIPS 204のポスト量子署名ML-DSAを実装し、`crypto/x509` と `crypto/tls`（TLS 1.3の `MLDSA44`・`MLDSA65`・`MLDSA87`）も対応しました。ベクトル幅に依存しない `simd` パッケージは実験扱いで、`GOEXPERIMENT=simd` を付けたときだけ使えます。日常的に効く小さな追加は次のとおりです。

- `strings.CutLast`・`bytes.CutLast`：最後の区切り文字で分割する
- `httptest.NewTestServer`：`testing/synctest` と組み合わせられるメモリ上のテストサーバー
- `net/http`：HTTP/1の `Response.Body` を閉じたとき、未読分を一定量まで読み捨てて接続を再利用する
- `compress/flate`：圧縮が速くなった代わりに出力バイト列が1.26と変わりうる（gzip・zip・PNGも同様）
- `unicode`：Unicode 15から17へ更新

## Go 1.27のランタイムとツールの変更

### 小さいオブジェクトの割り当て高速化の実測

コンパイラがサイズ別の割り当てルーチンを呼ぶようになり、リリースノートは「80バイト未満の割り当てコストを最大30%削減、割り当ての多い実プログラム全体では約1%」としています。オプトアウトの `GOEXPERIMENT=nosizespecializedmalloc` と比べました（go1.27.3、darwin/amd64、Intel Core i9-9880H、`-cpu 1`。構造体へのポインタをパッケージ変数に保持してヒープ割り当てを発生させ、既定とオプトアウトを交互に各8回実行した中央値）。

| 割り当て      | 既定          | nosizespecializedmalloc |
| --------- | ----------- | ----------------------- |
| 16バイトの構造体 | 84.4 ns/op  | 111.1 ns/op             |
| 64バイトの構造体 | 131.6 ns/op | 158.8 ns/op             |

他の処理が動いている負荷の高い環境での値なので絶対値は参考程度ですが、2回の計測とも既定のほうが約2割速くなりました。代わりにバイナリが大きくなります。`fmt.Println` だけのプログラム（darwin/amd64、`-trimpath`）は既定2,496,288バイト、オプトアウトで2,453,504バイトで、差は約42KBでした（公式の目安は約60KB）。このオプトアウトはGo 1.28で削除される予定です。

### goroutineleakプロファイルの正式化とasynctimerchanの削除

Go 1.26で実験扱いだった `goroutineleak` プロファイルが正式機能になり、`runtime/pprof` と `net/http/pprof` の `/debug/pprof/goroutineleak` で使えます。GCの到達可能性を使い、到達不能なチャネルやミューテックスで止まったgoroutineを報告します。グローバル変数から届くチャネルで止まっている場合は検出できません。実際の出力例は[Goのchannelの挙動をGo 1.27で検証した記事](/tech/details/5061/)に、goroutineの基礎は[ゴルーチンの仕組みの記事](/tech/details/4632/)にあります。あわせて `asynctimerchan` のGODEBUGが削除され、`time` パッケージのチャネルは常にバッファなしになりました。

### go fix・go test・go doc・go mod tidyの変更

`go fix` に `atomictypes`・`embedlit`・`slicesbackward`・`unsafefuncs` の4つのモダナイザーが加わり、`fmtappendf` は削除、`waitgroup` は `waitgroupgo` に改名されました。`embedlit` は `Habitat: Habitat{Burrow: "x"}` を `Burrow: "x"` に書き換えるもので、`go fix -diff -embedlit ./...` で試すと、go.modが `go 1.27` のモジュールでは差分が出て、`go 1.26` のモジュールでは何も出ませんでした。言語版が1.27未満だと書き換え後のコードがコンパイルできないためです。そのほか、`go test` が既定で `stdversion` 検査を実行し、`go doc` は `package@version` 記法と `-ex` フラグに対応、`go mod tidy` は、go.modの `go` 行が1.27以上の場合に、重複したrequireブロックを直接依存用と間接依存用の最大2つにまとめます。

## Go 1.26から1.27へ上げると止まる箇所の実測

### go.modのgo行が1.26の場合の構文制限

ツールチェーンだけgo1.27.3にして、go.modが `go 1.26` のまま1.27の文法を書くと、次のように止まります。go1.26.10ではそもそも構文エラーです。

```
// go1.27.3 + go.modが go 1.26
./main.go:12:22: generic method requires go1.27 or later (-lang was set to go1.26; check go.mod)
./main.go:35:30: use of promoted field Habitat.Burrow in struct literal of type Gopher requires go1.27 or later (-lang was set to go1.26; check go.mod)

// go1.26.10
./main.go:12:21: syntax error: method must have no type parameters

// go1.26.10 + GOTOOLCHAIN=local + go.modが go 1.27
go: go.mod requires go >= 1.27 (running go 1.26.10; GOTOOLCHAIN=local)
```

最後のエラーはCIで `GOTOOLCHAIN=local` を指定していると出ます。依存ライブラリが `go 1.27` に上がったときも同じなので、CIのイメージかGOTOOLCHAINの設定を先に上げます。

### go buildは通りgo testだけが落ちるstdversion

go.modが `go 1.26` のまま、1.27で追加された `strings.CutLast` を使うと、go1.27.3では `go build` は終了コード0で通ります。ところが `go test` は既定で `stdversion` 検査を走らせるため、次のエラーでビルド失敗扱いになります。

```
$ go test ./...
./base.go:6:25: strings.CutLast requires go1.27 or later (module is go1.26)
FAIL	example.com/e2 [build failed]
```

手元はgo1.27で通るのに、go.modどおりgo1.26でビルドする利用者側では壊れる、という事故を防ぐための検査です。`go build` だけで移行の成否を判断しないでください。

### 削除されたGODEBUGの旧値によるビルド・起動エラー

Go 1.27は `asynctimerchan`、`gotypesalias`、`tls10server`、`tlsrsakex`、`tls3des`、`tlsunsafeekm`、`x509keypairleaf` のGODEBUGを削除しました。削除前の最終的な既定値（`asynctimerchan=0` など）を書いた行は受け入れられますが、古い値を書いた行はエラーになります。設定場所ごとの実測結果は次のとおりです。

```
//go:debug asynctimerchan=0   → ビルド可
//go:debug asynctimerchan=1   → invalid //go:debug: removed GODEBUG "asynctimerchan" set to old value "1"
go.modの godebug tls10server=1 → go: error loading go.mod: go.mod:5: removed GODEBUG "tls10server" set to old value "1"
実行時の環境変数 GODEBUG=asynctimerchan=1
  → fatal error: removed GODEBUG "asynctimerchan" set to old value "1" in environment
```

最後のケースは、ビルドは通るのに起動した瞬間に落ちます。Kubernetesのマニフェストやsystemdのユニットに `GODEBUG` を書いている場合は、ソースだけでなくデプロイ設定もgrepしてください。

### そのほかの非互換と上げる順番

- macOS 13 Ventura以上が必須。macOS 12のビルドマシンでは動かない
- gofmtの桁揃えの判定が修正され、整形済みのファイルに空白だけの差分が出ることがある
- クロージャのシンボル名が単純になり、シンボル名を比べるテストは更新が要る
- `go tool trace -http=:6060` はlocalhostだけで待ち受けるようになった
- Linuxのビッグエンディアンppc64はELFv2 ABIへ切り替わり、カーネル3.13以上が前提

実測を踏まえた順番は、(1) `toolchain` 行かCIのイメージをgo1.27.3にしてパッチを取り込む、(2) `//go:debug`・go.modの `godebug`・デプロイ設定の `GODEBUG` を洗う、(3) `go` 行を1.27に上げて `go test ./...` を通す、(4) `go mod tidy` と `go fix ./...` の差分をレビューする、です。JSONのゴールデンテストや圧縮データのバイト比較を持つプロジェクトは、(3)で差分が出ても期待値の更新で済むかを個別に判断します。依存の脆弱性は[govulncheckの使い方の記事](/tech/details/3013/)の手順で、上げた後にも確認しておくと安心です。複数サービスを抱えていて移行の計画から相談したい場合は、Goを含む[フルスクラッチ開発の支援](/service/system/fullscratch/)でも対応しています。

## Go 1.26（1つ前の版）の主な変更点

1.26系も2027年2月のGo 1.28公開まではサポートが続きます。[Go 1.26のリリースノート](https://go.dev/doc/go1.26)から、1.27でも前提になる変更を挙げます。

- Green Tea GCが既定になり、GCを多用する実プログラムではGCオーバーヘッドが10〜40%減る見込み（Intel Ice Lake・AMD Zen 4以降のamd64ではさらに約10%の改善を見込む。効果は処理内容による）
- cgo呼び出しの基本オーバーヘッドを約30%削減
- `new` の引数に式を書ける（`new(yearsSince(born))`）
- `errors.AsType`（`errors.As` のジェネリック版）と `crypto/hpke` の追加
- `image/jpeg` のエンコーダとデコーダを置き換え、出力のバイト列が変わりうる
- `cmd/doc` を削除し `go doc` に統合、pprofのWeb UIはフレームグラフが既定

1.26のノートは旧GCに戻す `GOEXPERIMENT=nogreenteagc` を「1.27で削除の見込み」としていましたが、go1.27.3でもこの指定でビルドが通りました（1.27のノートにも削除の記載はありません）。`errors.AsType` の使い方は[Goのエラーハンドリング実装ガイド](/tech/details/3895/)で扱っています。

## Go 1.28の予定：2027年2月リリースに向けた変更

次のGo 1.28は2027年2月に出る予定です。作業中の[Go 1.28のドラフトノート](https://tip.golang.org/doc/next)には、`bufio.Scanner` のループ後にエラー確認を忘れたコードを報告するvetの `scannererr`（`sql.Rows` 向けの `sqlrowserr` も同様）、`flag.FlagSet.All` の追加、ブートストラップにGo 1.26.0以上が必要になる変更が載っています。正式版までに内容が変わるので、採用判断は正式なリリースノートを待ってください。

## よくある質問

### Go 1.27はいつリリースされましたか？

正式版のgo1.27.0は2026年8月19日に公開されました。その後、go1.27.1（9月1日）、go1.27.2（10月8日）、go1.27.3（10月19日）のパッチ版が出ています。

### 今インストールするならGoのどのバージョンですか？

新規ならGo 1.27系の最新パッチ（2026年10月26日時点でgo1.27.3）です。macOS 12で開発している場合や依存の対応を待つ場合はgo1.26.10を使います。どちらもサポート中ですが、1.26系は2027年2月のGo 1.28公開でサポートを終えます。

### Go 1.27でencoding/jsonを使う既存コードは書き換えが必要ですか？

必要ありません。`encoding/json` は内部がv2実装になりましたが、v1の挙動は保たれます。リリースノートはエラーメッセージの文面が変わりうるとしているので、エラー文字列を比べるテストだけは確認してください。

### Go 1.26と1.27のどちらで新しいコードを書くべきですか？

ジェネリックメソッドや `uuid` を使うなら1.27です。go.modの `go` 行を1.27にすると、利用者側もgo1.27以上が必要になります。ライブラリとして配布するコードは、利用者の環境に合わせて1.26に据え置く判断もあります。

### Go 1.27はmacOS 12で使えますか？

使えません。Go 1.27はmacOS 13 Ventura以上が必須で、macOS 12 Montereyで動く最後の版は1.26です。

## 関連記事

- [GOTOOLCHAINとは｜Go Toolchainでバージョンを自動切り替えする仕組みと設定方法](/tech/details/5635/)
- [Go言語とは｜1.27系の導入からHTTP APIを動かすまでの実装入門](/tech/details/17483/)
- [Go 1.25の新機能と変更点｜1.24から上げると挙動が変わる箇所を実測](/tech/details/8421/)
- [Goのchannel（チャネル）入門｜close・select・デッドロックの挙動をGo 1.27で検証](/tech/details/5061/)
- [UUIDv7とは？UUIDv4との違い・言語別の生成方法と主キー設計の注意点](/tech/details/11650/)

---

出典: [Go 1.27の新機能・変更点まとめ｜Goの最新バージョンは1.27、確認・更新方法と移行の注意点](<https://www.issoh.co.jp/tech/details/10416/>)（株式会社一創）
