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
Go1.22のリリース予定の機能を見る
Search
matumoto
January 21, 2024
Technology
82
0
Share
Go1.22のリリース予定の機能を見る
Zli 大LT 2023冬 in Aizuでの登壇資料です
イベントページはこちら
https://zli.connpass.com/event/306455/
matumoto
January 21, 2024
More Decks by matumoto
See All by matumoto
Go標準パッケージのI/O処理をながめる
matumoto
0
400
testingを眺める
matumoto
1
200
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
710
Goトランザクション処理
matumoto
1
78
いまいちどスライスの 挙動を見直してみる
matumoto
0
400
GoのUnderlying typeについて
matumoto
0
220
Typed-nilについて
matumoto
0
370
GoのType Setsという概念
matumoto
0
48
GoのRateLimit処理の実装
matumoto
0
470
Other Decks in Technology
See All in Technology
Purview 勉強会報告 Microsoft Purview 入門しようとしてみた
masakichixo
1
240
CyberAgent YJC Connect
shimaf4979
1
170
AI時代に、 データアナリストがデータエンジニアに異動して
jackojacko_
0
600
AIが盛んな時代に 技術記事を書き始めて起きた私の中での小さな変化
peintangos
0
370
[Scram Fest Niigata2026]Quality as Code〜AIにQAの思考を再現させる試み〜
masamiyajiri
1
300
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
260
Every Conversation Counts
kawaguti
PRO
0
200
React 19×Rustツール 進化の「ズレ」を設計で埋める
remrem0090
1
110
Digital Independence: Why, When and How
wannesrams
0
310
20260513_生成AIを専属DSに_AI分析結果の検品テクニック_ハンズオン_交通事故データ
doradora09
PRO
0
210
自動テストだけで リリース判断できるチームへ - 鍵はテストの量ではなくリリース判断基準の再設計にあった / Redesigning Release Criteria for Lightweight Releases
ewa
7
3.6k
Forget technical debt
ufried
0
180
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Paper Plane
katiecoart
PRO
1
50k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
270
Ruling the World: When Life Gets Gamed
codingconduct
0
220
Producing Creativity
orderedlist
PRO
348
40k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Abbi's Birthday
coloredviolet
2
7.5k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
290
Believing is Seeing
oripsolob
1
120
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
WCS-LA-2024
lcolladotor
0
580
The Invisible Side of Design
smashingmag
302
52k
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が導入されるよ!
ありがとうございました