結論
Go 1.26が2026年2月にリリースされました。今回のアップデートは「パフォーマンスの天井を引き上げ、開発体験を底上げする」リリースです。実際のコードベースにすぐに取り入れられる新機能を中心に、移行時の注意点も含めて解説します。
// errors.AsType — 型安全なエラー判定
if e, ok := errors.AsType[*MyError](err); ok {
return e.Code, nil
}
// slog.NewMultiHandler — 複数出力に同時ロギング
logger := slog.New(slog.NewMultiHandler(
slog.NewTextHandler(os.Stdout, nil),
slog.NewJSONHandler(file, nil),
))
// new() — 初期値を直接指定
agePtr := new(yearsSince(born))
大体の雰囲気は、上の3つです。
以下、各機能を詳しく見ていきましょう。
1. Green Tea GC — GCオーバーヘッドを最大40%削減
何が変わったか
Go 1.25で実験導入されたGreen Tea GCが、Go 1.26でデフォルトになりました。
従来のGCはオブジェクトがメモリ上にバラバラに配置されるため、キャッシュミスが頻発していました。Green Tea GCは小さなオブジェクトを連続したメモリ領域に配置し、ベクトル命令でまとめて処理します。
// 従来のGC: オブジェクトが散在 → キャッシュミス多発
// [objA] .... [objB] .... [objC] ....
//
// Green Tea GC: 連続配置 → キャッシュヒット率向上
// [objA][objB][objC] .... ....
// コードの書き方は一切変わりません
var users []*User
for i := range 100000 {
users = append(users, &User{ID: i, Name: fmt.Sprintf("user-%d", i)})
}
time.Sleep(5 * time.Second)
パフォーマンスの実感
Webサーバーやデータパイプラインのような、大量の小さなオブジェクトを頻繁に生成・破棄する処理で顕著な差が出ます。ベンチマークによると、GCオーバーヘッドが10〜40%削減されるとのこと。コードを1行も変えずに性能が上がるのは嬉しいですね。
どうしても元のGCに戻したい場合
GOEXPERIMENT=nogreenteagc go build
特別な理由がない限りデフォルトのまま使うのをおすすめします。
2. errors.AsType — もうエラー判定で悩まない
これまでの課題
従来の errors.As は、変数を宣言してそのポインタを渡す必要がありました。すこし冗長ですよね。
// Go 1.25 までの書き方
var target *MyError
if errors.As(err, &target) {
fmt.Println(target.Code)
}
Go 1.26の新しい書き方
// Go 1.26 からの書き方 — 型パラメータでスマートに
if e, ok := errors.AsType[*MyError](err); ok {
// e は自動的に *MyError 型に推論される
fmt.Println(e.Code)
}
型スイッチのように自然に書けるようになりました。コードの可読性がぐっと上がります。
実践例:カスタムエラーの処理
type NotFoundError struct {
Resource string
ID string
}
func (e *NotFoundError) Error() string {
return fmt.Sprintf("%s %s not found", e.Resource, e.ID)
}
func handler(w http.ResponseWriter, r *http.Request) {
user, err := findUser(r.URL.Query().Get("id"))
if err != nil {
if nf, ok := errors.AsType[*NotFoundError](err); ok {
http.Error(w, nf.Resource+"が見つかりません", http.StatusNotFound)
return
}
http.Error(w, "Internal Error", http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(user)
}
3. slog.NewMultiHandler — ログの複数出力が標準で可能に
これまでのワークアラウンド
「標準出力に出しつつ、ファイルにも保存したい」「エラーログだけ監視サービスにも送りたい」といった要件、よくありますよね。Go 1.25までは自前のハンドラー実装が必要でした。
Go 1.26からの標準的な書き方
import "log/slog"
func setupLogger() *slog.Logger {
file, _ := os.Create("app.log")
fileHandler := slog.NewJSONHandler(file, &slog.HandlerOptions{
Level: slog.LevelInfo,
})
stdoutHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})
logger := slog.New(slog.NewMultiHandler(stdoutHandler, fileHandler))
return logger
}
func main() {
logger := setupLogger()
logger.Info("サーバー起動", "port", 8080)
logger.Error("データベース接続エラー",
"host", "db.example.com",
"timeout", 30,
)
}
4. new()関数の拡張 — もっと直感的に
変わったこと
Go 1.26から、new 関数が初期値(式)を受け取れるようになりました。
// Go 1.25 まで:2行必要
age := yearsSince(born)
p := Person{Name: name, Age: &age}
// Go 1.26 から:1行でOK
p := Person{Name: name, Age: new(yearsSince(born))}
実践的な活用シーン
func newPerson(name string, born time.Time) Person {
return Person{
Name: name,
Age: new(yearsSince(born)),
}
}
func yearsSince(t time.Time) int {
return int(time.Since(t).Hours() / (365.25 * 24))
}
JSONのシリアライズでポインタフィールドがある場合や、オプショナルな値をポインタで表現する際に重宝します。
5. そのほか注目の変更
cgoのオーバーヘッド30%削減
C/C++とのバインディングを多用しているプロジェクトは特に大きな恩恵を受けられます。コード変更なしでcgo呼び出しが高速化されます。これは嬉しい。
ヒープベースアドレスのランダム化(セキュリティ強化)
64ビットプラットフォームで、起動時にヒープのベースアドレスがランダム化されるようになりました。cgo使用時のメモリ関連脆弱性の悪用を困難にします。
実験的機能:simd/archsimdパッケージ
GOEXPERIMENT=simd をビルド時に指定すると、SIMD命令をGoから直接使えるようになります。画像処理や暗号処理の高速化に使えますが、まだ実験的APIなのでプロダクション利用は慎重に。
移行チェックリスト
Go 1.25から1.26にアップデートするときは、以下の3点だけ確認すれば大体OK。
- Go 1.24.6以降が必要(ブートストラップ要件)
- macOS 12 Montereyが最終サポート(次バージョンから13 Ventura必須)
- windows/arm(32bit)が削除(該当する環境は稀ですが要注意)
動作に影響する破壊的変更はほぼありません。いつもの go mod tidy と go vet を通せば安心です。
【広告】このサイトはConoHa WINGで運営しています。安定した高速サーバーで快適にブログを書けています。いつもありがとう!![]()

コメント