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によると、直近の公開は次のとおりです。
| バージョン | 公開日 | 主な内容 |
|---|---|---|
| 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の新機能と変更点の記事にまとめています。次の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 [email protected]
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 [email protected]
go: added toolchain go1.27.3
違いは言語版です。go get [email protected] は go 行を上げるのでジェネリックメソッドなど1.27の言語機能が有効になり、後述の検査も1.27基準に変わります。toolchain 行だけを足すと、ビルドに使うツールチェーンはgo1.27.3になる一方、言語版は1.26のままです。まずツールチェーンだけ上げてパッチのセキュリティ修正を取り込み、go 行は検証が済んでから上げる、という2段階にできます。仕組みはGOTOOLCHAINでバージョンを自動切り替えする記事で詳しく扱っています。
インストーラ・DockerイメージによるGoの更新
マシンに入れるGo本体は、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のリリースノートが挙げる言語変更は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の違いの記事を参照してください。
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で検証した記事に、goroutineの基礎はゴルーチンの仕組みの記事にあります。あわせて 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の使い方の記事の手順で、上げた後にも確認しておくと安心です。複数サービスを抱えていて移行の計画から相談したい場合は、Goを含むフルスクラッチ開発の支援でも対応しています。
Go 1.26(1つ前の版)の主な変更点
1.26系も2027年2月のGo 1.28公開まではサポートが続きます。Go 1.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のエラーハンドリング実装ガイドで扱っています。
Go 1.28の予定:2027年2月リリースに向けた変更
次のGo 1.28は2027年2月に出る予定です。作業中のGo 1.28のドラフトノートには、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です。