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
51
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
16
いまいちどスライスの 挙動を見直してみる
matumoto
0
230
GoのUnderlying typeについて
matumoto
0
120
Typed-nilについて
matumoto
0
130
GoのType Setsという概念
matumoto
0
11
GoのRateLimit処理の実装
matumoto
0
150
Webプッシュ通知触ってみた
matumoto
0
27
拡張ユークリッドの互除法の紹介
matumoto
0
98
Goでの楕円曲線暗号の実装
matumoto
0
29
Other Decks in Technology
See All in Technology
いまからでも遅くない! コンテナでWebアプリケーションを 動かしてみよう(2-1)WebAPI座学
nomu
0
140
Amazon BedrockとPR-Agentでコードレビュー自動化に挑戦・実際に運用してみた
diggymo
0
550
Product Utilization of Large Language Models Starting Today
ymatsuwitter
2
600
【swonet.conf_】NOCメンバーが語るSTMの実態!! ~ShowNetから若者への贈り物~
shownet
PRO
0
230
第45回 MLOps 勉強会 - ML Test Score を用いた機械学習システムの定量的なアセスメント
masatakashiwagi
3
190
クレジットカードを製造する技術
yutadayo
27
10k
低コストで実現する社内文書RAG機能を搭載したAIチャットボット開発
takapy
3
570
【shownet.conf_】トポロジ図の歩き方
shownet
PRO
0
360
All your memory are belong to… whom?
ennael
PRO
0
530
スクラム導入の舞台裏:QAエンジニアがスクラムマスターになるまで
bubo1201
0
110
【shownet.conf_】3Dアプローチで守るセキュリティ
shownet
PRO
0
280
XP matsuri 2024 - 銀河英雄伝説に学ぶ
kawaguti
PRO
3
500
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Speed Design
sergeychernyshev
22
460
From Idea to $5000 a Month in 5 Months
shpigford
380
46k
Designing the Hi-DPI Web
ddemaree
279
34k
The Language of Interfaces
destraynor
154
24k
Scaling GitHub
holman
458
140k
Atom: Resistance is Futile
akmur
261
25k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
Designing for humans not robots
tammielis
249
25k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
22k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
7.5k
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が導入されるよ!
ありがとうございました