Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
What's new in Go 1.25?
Search
Koya IWAMURA
September 30, 2025
0
40
What's new in Go 1.25?
Koya IWAMURA
September 30, 2025
Tweet
Share
More Decks by Koya IWAMURA
See All by Koya IWAMURA
What's new in Go 1.24?
ciarana
1
210
What's new in Go 1.21?
ciarana
2
1.5k
PGOによるコンパイラ最適化 / Compiler Optimization with PGO
ciarana
2
900
Go1.13以後のエラーハンドリングについて語ろう / Let's talk about error handling after Go 1 13
ciarana
10
8.6k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
280
23k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Practical Orchestrator
shlominoach
190
11k
The World Runs on Bad Software
bkeepers
PRO
71
11k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
880
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
Building Adaptive Systems
keathley
43
2.8k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Statistics for Hackers
jakevdp
799
220k
Transcript
What's new in Go 1.25? シアラナ Go 1.25 リリースパーティ 2025-09-30
1
自己紹介 𝕏: @cia_rana 株式会社カプコン 所属 Go1.X New Features シリーズ 書いています
2
リリースおめでとうございます 3
配布サイズの削減 一部事前ビルドされたツールが公式が配布するバイナリに含まれなくなる 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
go.mod ignore ディレクティブ go コマンドが無視するディレクトリを指定可能 module example.com/myproject go 1.25 ignore
node_modules ignore bazel-* ignore .build 5
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
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
GOMAXPROCS のデフォルト動作変更 Linux で、cgroup のCPU 帯域幅制限を考慮するように Kubernetes などのコンテナランタイムシステムにおけるCPU limit オ
プションに対応 CPU 帯域幅制限によるCPU 数が論理CPU 数より低い場合、 GOMAXPROCS はデフォルトで制限された値に設定 すべてのOS で、ランタイム中に論理CPU 数やcgroup のCPU 帯域幅制限が 変更された場合、定期的にGOMAXPROCS を更新 GOMAXPROCS 環境変数やruntime.GOMAXPROCS を明示的に設定していると上記 の挙動は無効化される 8
新しいガベージコレクタ 既存のガベージコレクタの一部を置き換える新しいガベージコレクタが実 験的に利用可能 Green Tea GC と呼ばれる 命名の由来: メインで実装したAustin Clements
氏が、日本滞在中に毎 日抹茶 を飲みながら大部分の開発を行ったから Russ Cox on passing the torch - Go Time より良い局所性とCPU スケーラビリティを通じて小さなオブジェクトのマ ーキングとスキャンの性能を向上 GC が頻繁に行われるワークロードではオーバーヘッドが10 〜40% 程度削 減される見込み 9
runtime/trace.FlightRecorder トレース情報をメモリ内のリングバッファに継続的に記録することで、ラ ンタイムの実行トレースをキャプチャする軽量な手段を提供 重要なイベントが発生した際、runtime/trace.(*FlightRecorder).WriteTo を呼び出し、過去短期間のトレース情報を保存可能 recorder := trace.NewFlightRecorder( trace.FlightRecorderConfig{ MinAge:
5 * time.Second, // 過去5秒間のトレースを保持 MaxBytes: 0, // 0の場合サイズ上限なしで保持 }, ) recorder.Start() defer recorder.Stop() file, _ := os.Create("trace.out") // 問題検出時にトレースを保存 recorder.WriteTo(file) 10
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
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
testing/synctest package 並行処理中にwait のあるコードのテストをサポート Test 関数は、隔離されたスコープである「バブル」内でテスト関数を実 行 バブル内では、時間は仮想化される time パッケージの処理は疑似クロックで動作
バブル内のすべてのgoroutine がブロックされると、瞬時にクロックが 進む Wait 関数は、現在のバブル内のすべてのgoroutine がブロックされるまで 待つ 13
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
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
go/parser ParseDir 関数が非推奨に ビルドタグを考慮せずにパースしていた 代替手段として、golang.org/x/tools/go/packages の使用を推奨 16
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
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
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
reflect 新しいTypeAssert 関数が追加 Value を指定された型のGo 値に直接変換 Value.Interface() の結果に型アサーションを使うのと同じ 不要なメモリ割り当てを回避 v
:= reflect.ValueOf(42) i := v.Interface().(int) // Go 1.24まで i := reflect.TypeAssert[int](v) // Go 1.25以降 20
Appendix [Blog] Go1.25 New Features [Doc] Go 1.25 Release Notes
- The Go Blog [Blog] Go 1.25 interactive tour - Anton Zhiyanov 21