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
0
65
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
110
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
300
Goトランザクション処理
matumoto
1
45
いまいちどスライスの 挙動を見直してみる
matumoto
0
340
GoのUnderlying typeについて
matumoto
0
190
Typed-nilについて
matumoto
0
300
GoのType Setsという概念
matumoto
0
24
GoのRateLimit処理の実装
matumoto
0
350
Webプッシュ通知触ってみた
matumoto
0
32
Other Decks in Technology
See All in Technology
【 LLMエンジニアがヒューマノイド開発に挑んでみた 】 - 第104回 Machine Learning 15minutes! Hybrid
soneo1127
0
130
LLM時代の検索とコンテキストエンジニアリング
shibuiwilliam
2
1.2k
自社製CMSからmicroCMSへのリプレースがプロダクトグロースを加速させた話
nextbeatdev
0
150
「守る」から「進化させる」セキュリティへ ~AWS re:Inforce 2025参加報告~ / AWS re:Inforce 2025 Participation Report
yuj1osm
1
140
浸透しなさいRFC 5322&7208
hinono
0
120
新卒(ほぼ)専業Kagglerという選択肢
nocchi1
1
2.4k
事業価値と Engineering
recruitengineers
PRO
3
1.2k
microCMS 最新リリース情報(microCMS Meetup 2025)
microcms
0
120
モダンな現場と従来型の組織——そこに生じる "不整合" を解消してこそチームがパフォーマンスを発揮できる / Team-oriented Organization Design 20250825
mtx2s
6
650
帳票Vibe Coding
terurou
0
140
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
30k
見てわかるテスト駆動開発
recruitengineers
PRO
6
800
Featured
See All Featured
Code Review Best Practice
trishagee
70
19k
How STYLIGHT went responsive
nonsquared
100
5.7k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
We Have a Design System, Now What?
morganepeng
53
7.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
A Modern Web Designer's Workflow
chriscoyier
695
190k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Music & Morning Musume
bryan
46
6.7k
Thoughts on Productivity
jonyablonski
69
4.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が導入されるよ!
ありがとうございました