Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go1.22のリリース予定の機能を見る
Search
matumoto
January 21, 2024
Technology
0
69
Go1.22のリリース予定の機能を見る
Zli 大LT 2023冬 in Aizuでの登壇資料です
イベントページはこちら
https://zli.connpass.com/event/306455/
matumoto
January 21, 2024
Tweet
Share
More Decks by matumoto
See All by matumoto
testingを眺める
matumoto
1
170
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
520
Goトランザクション処理
matumoto
1
53
いまいちどスライスの 挙動を見直してみる
matumoto
0
360
GoのUnderlying typeについて
matumoto
0
210
Typed-nilについて
matumoto
0
340
GoのType Setsという概念
matumoto
0
32
GoのRateLimit処理の実装
matumoto
0
420
Webプッシュ通知触ってみた
matumoto
0
36
Other Decks in Technology
See All in Technology
履歴テーブル、今回はこう作りました 〜 Delegated Types編 〜 / How We Built Our History Table This Time — With Delegated Types
moznion
15
9.2k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
47k
Bakuraku Engineering Team Deck
layerx
PRO
11
5.2k
freeeにおけるファンクションを超えた一気通貫でのAI活用
jaxx2104
3
550
あなたの知らないDateのひみつ / The Secret of "Date" You Haven't known #tqrk16
expajp
0
110
Kill the Vibe?Architecture in the age of AI
stoth
1
170
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
37k
How native lazy objects will change Doctrine and Symfony forever
beberlei
1
370
mablでリグレッションテストをデイリー実行するまで #mablExperience
bengo4com
0
470
Design System Documentation Tooling 2025
takanorip
1
900
Capture Checking / Separation Checking 入門
tanishiking
0
110
pmconf2025 - データを活用し「価値」へ繋げる
glorypulse
0
380
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
66k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
GitHub's CSS Performance
jonrohan
1032
470k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
690
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Automating Front-end Workflow
addyosmani
1371
200k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
960
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Transcript
Go1.22の リリース予定の機能を見る 2024-01-20 Zli 大LT
• 学年:28期 • 所属:会津大学コンピュータ理工学部 • 今興味のある技術:Rust🦀 • 趣味: ◦ Splatoon3ᔦꙬᔨ
◦ モンハン ◦ VTuberを見る ▪ 最近は叶推し • X(Twitter):@matumoto_1234 matumoto 松本 響輝 自己紹介
Goのリリースサイクル • Goは6ヶ月ごとにリリースされる(2月と8月) • 実際にリリースされる前にRC(Release Candidate)が発表される 図の引用元:https://go.dev/wiki/Go-Release-Cycle
Go1.22を見てみよう
注意 • あくまで 追加予定 なので、絶対追加されるわけではない • 元々Acceptedされていた機能がDeclinedになることだってあった ◦ ゼロ値 zero
の導入はAcceptedだったが、開発スケジュール的に Declinedになった • 全ての機能を紹介するのではなく、 個人的に知っておきたい機能を紹介 • 細かな仕様変更や詳細はリリースノートを見てみてね
forループ変数のセマンティクスの変更 • forループは元々一つの変数を使いまわしていた • (rangeを使った場合もそうでない場合も) すべて同じアドレス!
forループ変数のセマンティクスの変更 • Go1.22からは別々の変数として作られるようになる 同じコードでも、異なるアドレス
forループ変数のセマンティクスの変更 • こういうコードは想定した挙動と変わってしまうのでは ...? 偶数だけ出力してほしい
forループ変数のセマンティクスの変更 • 3節の形式のforループ(for i := 0;i<10;i:+ {})はループ本体の最後で次の変数にコ ピーされるような効果をもっている
forループ変数のセマンティクスの変更 • 後方互換性が崩れてない? ◦ Goは完全に後方互換性を保証しているわけではない ◦ Go1.22以降を宣言するモジュールにのみ適用される ▪ 新しいツールチェインを採用するだけで挙動が変わるとかはない ◦
ツールが公式から提供されている ▪ 変更によって影響を受ける箇所を表示 ▪ テストの失敗を引き起こすループを特定
forループ変数のセマンティクスの変更 • なんでこの変更が入ったか? ◦ ループ変数のアドレスや、ループ変数をクロージャでキャプチャする際に意図していない 動作をさせてしまうことが多くあった クイズ. 何が出力される? ※Go1.21で実行した場合
forループ変数のセマンティクスの変更 • なんでこの変更が入ったか? ◦ ループ変数のアドレスや、ループ変数をクロージャでキャプチャする際に意図していない 動作をさせてしまうことが多くあった 正解
forループ変数のセマンティクスの変更 • Go1.22からは想定通りに動作する ちゃんと0になってる!
range over int • forループのrangeで整数が取れるようになった
range over int • カウンタ変数に関心がないときなどに便利
ルーティングパターンの強化 • 標準ライブラリのHTTPルーティングが強化された ◦ ハンドラーにメソッドを登録可能 ▪ GET /items のようにすると、ハンドラーの呼び出しはそのメソッドを持つリクエス トに制限される
◦ ワイルドカードをパターンで使用可能 ▪ items/{id} のように使用できる ▪ files/{path::.} のように ::. で終わるワイルドカードは残りのすべてのセグ メントにマッチする
ルーティングパターンの強化 • 標準ライブラリのルーティングがかなり使いやすくなった! ◦ 今までワイルドカードを使用したかった場合は 自力でパース or GinやechoなどのWebフ レームワークに頼る などをしていた
• 既に net/http だけを使ったライブラリも出てきている ◦ https://github.com/sonatard/michi
ルーティングパターンの強化 • 後方互換性は大丈夫なの? ◦ パスに {} を使用したパターンなどは壊れてしまう ▪ (使ってるケースは少ないだろうけど...) ◦
GODEBUG 環境変数へ httpmuxgo121 を設定すると以前の動作に戻る ◦ 例. GODEBUG=httpmuxgo121=1
Goのイテレータ処理について • イテレータを標準機能だけで表現させるために導入される • 現状、標準ライブラリでも統一的な書き方が定まっていない sql.Rows.Next() と sql.Rows.Scan() database/sql tar.Reader.Next()
archive/tar
Goのイテレータ処理について • 例えばこんなかんじに書けたら嬉しいよね! スライスの要素を後ろから出力する
できるの?
GOEXPERIMENT でできます
GOEXPERIMENTとは? • ツールチェインの実験をGOEXPERIMENTという環境変数で制御している ◦ 値はカンマ区切りのリスト ◦ 例. GOEXPERIMENT=loopvar,rangefunc • 未来のバージョンで実装予定のものを実験的に
GOEXPERIMENTとして導入したりする ◦ 今から話すrange over funcもGo1.22でGOEXPERIMENT下に導入される
range over func • Go1.22からGOEXPERIMENT下で導入された機能 • さっきの Backward() はどう実装するか見ていく
range over func • Backward() は Sequence 関数を返す関数として実装する
range over func • さっきの Backward() はどう実装するか見ていく
range over func • yield() って誰よ! ◦ たしかに呼び出し側からもそんな関数を渡している様子はない ◦ 実は、コンパイラが生成する関数
(厳密には違う)
range over func • 呼び出し側のプログラムは、コンパイラ内ではこんな風に変換される
range over func • forループ内での制御処理は色んな形に変換される ◦ ループ終了時の暗黙的な continue は return
true ◦ continue は return true ◦ break は return false ◦ etc..
range over func • range over funcによって嬉しいこと ◦ イテレータの処理が統一的に書ける ▪
順方向連結リストのイテレータ ▪ 順序付き二分探索木のイテレータ • 例. for node := range bTree.all { … } ◦ それぞれの実装のデザインパターンに依存する必要がない ▪ 標準機能としてあることがうれしい
まとめ
まとめ • forループの挙動が変わるよ! ◦ ループごとの変数が新しく作り直されるよ ◦ rangeに整数を渡せるようになるよ • HTTPルーティングが強化されるよ! ◦
メソッドをハンドラーに登録できるようになるよ ◦ パスにワイルドカードが使えるよ • GOEXPERIMENT下にrange over funcが導入されるよ!
ありがとうございました