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
58
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
Goトランザクション処理
matumoto
0
27
いまいちどスライスの 挙動を見直してみる
matumoto
0
290
GoのUnderlying typeについて
matumoto
0
150
Typed-nilについて
matumoto
0
200
GoのType Setsという概念
matumoto
0
16
GoのRateLimit処理の実装
matumoto
0
220
Webプッシュ通知触ってみた
matumoto
0
30
拡張ユークリッドの互除法の紹介
matumoto
0
190
Goでの楕円曲線暗号の実装
matumoto
0
32
Other Decks in Technology
See All in Technology
re:Invent2024 KeynoteのAmazon Q Developer考察
yusukeshimizu
1
160
Amazon Route 53, 待ちに待った TLSAレコードのサポート開始
kenichinakamura
0
180
EMConf JP の楽しみ方 / How to enjoy EMConf JP
pauli
2
150
色々なAWSサービス名の由来を調べてみた
iriikeita
0
110
生成AI × 旅行 LLMを活用した旅行プラン生成・チャットボット
kominet_ava
0
170
【Oracle Cloud ウェビナー】2025年のセキュリティ脅威を読み解く:リスクに備えるためのレジリエンスとデータ保護
oracle4engineer
PRO
1
110
2024AWSで個人的にアツかったアップデート
nagisa53
1
110
「隙間家具OSS」に至る道/Fujiwara Tech Conference 2025
fujiwara3
7
6.6k
Bring Your Own Container: When Containers Turn the Key to EDR Bypass/byoc-avtokyo2024
tkmru
0
870
20250116_自部署内でAmazon Nova体験会をやってみた話
riz3f7
1
120
.NET 最新アップデート ~ AI とクラウド時代のアプリモダナイゼーション
chack411
0
200
Evolving Architecture
rainerhahnekamp
3
260
Featured
See All Featured
The Language of Interfaces
destraynor
155
24k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Code Reviewing Like a Champion
maltzj
521
39k
A better future with KSS
kneath
238
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Become a Pro
speakerdeck
PRO
26
5.1k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
It's Worth the Effort
3n
183
28k
Being A Developer After 40
akosma
89
590k
How GitHub (no longer) Works
holman
312
140k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
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が導入されるよ!
ありがとうございました