Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's new in Go 1.25?

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for Koya IWAMURA Koya IWAMURA
September 30, 2025
130

What's new in Go 1.25?

Avatar for Koya IWAMURA

Koya IWAMURA

September 30, 2025

Transcript

  1. 配布サイズの削減 一部事前ビルドされたツールが公式が配布するバイナリに含まれなくなる Go 1.24: 75MB → Go 1.25: 57MB (linux/amd64

    の場合) remove: addr2line, buildid, nm, objdump, pprof, test2json, trace 等 keep: go コマンド本体, gofmt, vet, compile, link, asm, cover 4
  2. go vet 新しいアナライザ waitgroup: sync.WaitGroup.Add の不適切な使用を検出 // 問題のあるコード var wg

    sync.WaitGroup for i := 0; i < 5; i++ { go func() { wg.Add(1) // NG: goroutine内でAdd() defer wg.Done() // 処理 }() } wg.Wait() // すべてのgoroutineが開始される前に完了する可能性 6
  3. go vet 新しいアナライザ hostport: IPv6 アドレス処理の改善を提案 // 問題のあるコード addr :=

    fmt.Sprintf("%s:%d", host, port) // 正しいコード addr := net.JoinHostPort(host, strconv.Itoa(port)) fmt.Sprintf("%s:%d", host, port) の形式でnet.Dial 用アドレスを構築す る場合、代わりにnet.JoinHostPort を提案 IPv6 アドレスの省略記法によりコロンが区別できなくなってしまう問題を 回避 7
  4. GOMAXPROCS のデフォルト動作変更 Linux で、cgroup のCPU 帯域幅制限を考慮するように Kubernetes などのコンテナランタイムシステムにおけるCPU limit オ

    プションに対応 CPU 帯域幅制限によるCPU 数が論理CPU 数より低い場合、 GOMAXPROCS はデフォルトで制限された値に設定 すべてのOS で、ランタイム中に論理CPU 数やcgroup のCPU 帯域幅制限が 変更された場合、定期的にGOMAXPROCS を更新 GOMAXPROCS 環境変数やruntime.GOMAXPROCS を明示的に設定していると上記 の挙動は無効化される 8
  5. 新しいガベージコレクタ 既存のガベージコレクタの一部を置き換える新しいガベージコレクタが実 験的に利用可能 Green Tea GC と呼ばれる 命名の由来: メインで実装したAustin Clements

    氏が、日本滞在中に毎 日抹茶 を飲みながら大部分の開発を行ったから Russ Cox on passing the torch - Go Time より良い局所性とCPU スケーラビリティを通じて小さなオブジェクトのマ ーキングとスキャンの性能を向上 GC が頻繁に行われるワークロードではオーバーヘッドが10 〜40% 程度削 減される見込み 9
  6. nil pointer bug Go 1.21 で混入したバグが修正された err がnon-nil の場合、f はnil

    になるためf.Name() はpanic すべき Go 1.21~1.24 では、コンパイラがnil チェックをエラーハンドリング後まで 不正に遅延 Go 1.25 で修正され、正しくpanic するように func main() { f, err := os.Open("nonExistentFile") name := f.Name() // エラーハンドリング前にfを使用 if err != nil { return } println(name) } 11
  7. nil pointer bug - より分かりやすい例 func main() { m :=

    map[string]*int{} t, ok := m[""] valid := *t > 0 // ① Go1.25からpanicする if !ok || !valid { fmt.Printf("got: %v\n", t) // ② Go1.24以前はここまで到達 } } Go 1.21~1.24: ①でpanic せず②を出力してプログラム正常終了 Go 1.25 以降: ①で正しくpanic する 12
  8. testing/synctest package 並行処理中にwait のあるコードのテストをサポート Test 関数は、隔離されたスコープである「バブル」内でテスト関数を実 行 バブル内では、時間は仮想化される time パッケージの処理は疑似クロックで動作

    バブル内のすべてのgoroutine がブロックされると、瞬時にクロックが 進む Wait 関数は、現在のバブル内のすべてのgoroutine がブロックされるまで 待つ 13
  9. encoding/json/v2 package (実験的サポート) 2 つの新しいパッケージが利用可能になる encoding/json/v2 パッケージは、encoding/json パッケージの代替 encoding/json/jsontext パッケージは、JSON

    構文のより低レベル処 理を提供 主な改善点 Unmarshal 処理の大幅な高速化 ストリーム処理をしながら解析したり、よりパフォーマンス重視に フィールドの命名規則やフォートマットの制御 v1 とv2 の挙動の違いは src/encoding/json/v2_diff_test.go が分かりやすい 14
  10. go/ast PreorderStack 関数が新しく追加 Inspect のように構文木をトラバースし、サブツリーへの降下を制御 親ノードのスタックも提供される ast.PreorderStack(node, func(n ast.Node, stack

    []ast.Node) bool { // stackには現在のノードに至るまでの親ノードが含まれる fmt.Printf("Node: %T, Stack depth: %d\n", n, len(stack)) return true // 子ノードへ続行 }) 15
  11. net/http.CrossOriginProtection 安全でないクロスオリジンブラウザのリクエストを拒否することにより、 Cross-Site Request Forgery (CSRF )に対する保護を行う Fetch Metadata を使用

    トークンやクッキーを必要とせず、オリジンベースとパターンベースのバ イパスをサポート protection := http.NewCrossOriginProtection() err := protection.AddTrustedOrigin("https://trusted.example.com") protection.AddInsecureBypassPattern("https://internal.example.com") http.Handle("/api/", protection.Wrap(http.HandlerFunc(apiHandler))) 17
  12. sync.WaitGroup.Go 複数のgoroutine を作成してそれらの終了を待つ一般的なパターンをより便 利に func processItems(items []string) { var wg

    sync.WaitGroup for _, item := range items { wg.Go(func() { // Add(1), Done()が自動的に呼ばれる process(item) }) } wg.Wait() } 18
  13. testing 新しいメソッド(*T).Attr 、(*B).Attr 、(*F).Attr は、テストのログに attribute を出力 attribute は、テストに紐づけされた任意のkey-value //

    例:TestFという名前のテストで t.Attr("environment", "staging") t.Attr("version", "1.2.3") 出力例: === ATTR TestF environment staging === ATTR TestF version 1.2.3 -json フラグを使用するとattribute は新しい「attr 」アクションとして出力 19
  14. Appendix [Blog] Go1.25 New Features [Doc] Go 1.25 Release Notes

    - The Go Blog [Blog] Go 1.25 interactive tour - Anton Zhiyanov 21