👨‍💻

Encraft #10「Go 1.22+ Enablement Lesson」開催レポート

2024/02/09に公開

株式会社ナレッジワークのバックエンドエンジニアのnasumです。
本記事では2024年1月30日に開催した勉強会 Encraft #10 Go 1.22+ Enablement Lesson の開催レポートをお届けいたします。

Encraftとは?

Encraft(エンクラフト)は株式会社ナレッジワークが提供する、 "Enablement" と "Craftsmanship" をテーマにした勉強会です。技術にこだわりを持つ人々が集まって互いに知見を交換し、できることを増やしていく場を作りたいと思っています。
過去のイベントの開催レポートは以下からご覧ください。

オフラインで参加することが難しい方などに向けて、今回も YouTube での Live 配信も行いました。
また、感想をハッシュタグ #encraft でつぶやいていただけると嬉しいです。

スクール形式での実施

今回のEncraftはスクール形式という少し変わった形式での実施となりました。

スクール形式とは先生と生徒がトピックについて議論し、参加者はそのやり取りを見るという、講義を聴講するような形で行われるものです。

先生にはKnowledgeworkから@tenntennさんが参加し、生徒には同じくKnowledgeworkから@idatenさん、株式会社サイバーエージェントから@kuroさん、そしてラクスル株式会社からはいばらさんが参加していました。

当日はtenntennさんも実際に会場に出席して講義を行う予定でしたが、急遽都合によりtenntennさんはリモートでの参加となってしまうアクシデントがありました。

Go 1.22+でfor文はどう変わる?

https://youtu.be/AaJGqXAovpU?si=r5jQ-VXKnBsYgBBP

まず初めのセッションとしてGo 1.22+でfor文がどう変わるかという質問がされました。

今まではループ変数が全て同じポインタを指すため、ループ変数を参照していた場合意図しない動きをすることがあったようです。Go 1.22+では違うポインタを使うようになるため、そのような心配をする必要がなくなるとのことでした。

package main

import "fmt"

func main() {
	var fs []func()
	for i:=0; i<10; i++ {
		fs = append(fs, func() {
			// この実行結果がgo 1.21と1.22では違います
			fmt.Printf("%d, %p\n", i, &i)
		})
	}
	for _, f := range fs {
		f()
	}
}

これに対する質問としては、挙動が変わるので破壊的な変更だと思うが大丈夫かという質問がされました。これに関してtenntennさんはimportされているパッケージのgo.modにかかれているバージョンによって挙動を変える仕組みがGoの1.21から入っていて、この機能によって後方互換性が保たれているということでした。

他にもfor rangeに使える型の話や、map.keysがいつ使えるようになるのかという話がこのセッションではなされていました。このセッションではライブコーディングで挙動を確認したり、Goの仕様やコードを実際に見に行くなど、ちゃんと動かして1次資料を見に行くことがされており、聴者はGoの深いところまで知ることができるセッションになっていたと思います。

途中こちらからの音声がtenntennさんに届かなくなるなどのアクシデントもありましたが、その間はtenntennさんがひたすら仕様の説明をしてくれていたので変な間ができることがなく進めることができてよかったです。

新しくなったnet/httpパッケージ

https://youtu.be/RTmoE0sDcZY?si=uF-rJNKI4cJiIVfI

次のレッスンは新しくなったnet/httpパッケージについてです。tenntennさんがGoのWebフレームワークで何を使っているか質問をしました。生徒役の方々はechoやginを使っているという回答でした。

GoのWebフレームワークを使う目的はミドルウェアの便利さだったりルーティングの改善で使うことが多いという話でした。今回の変更はそのルーティングの機能拡張でした。

その拡張はパスの前にHTTPメソッドを追記する形で実現できるように今回のアップデートではなるようです。

package main

import (
	"fmt"
	"net/http"
)


func main() {
    // パスの前にHTTPメソッドが書けるようになる
	http.HandleFunc("POST /", index)
	http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Printf("hoge")
}

他にもワイルドカードを使ってパス中の特定の箇所の値を取得できるようになるなどの拡張が追加されています。

そこでもしHTTPメソッドをtypoしたらどうなるかという実験をライブコーディングで行いました。結果は動画の方を見てもらえればと思います。

まとめ

Go言語の仕様からソースコードまで踏み込んだ内容の濃いイベントになったと思います。言語仕様まで扱う勉強会は少ないと思うので、Encraftならではなのではないでしょうか。

今回参加できなかった皆様も、アーカイブ配信を視聴できますので、アーカイブをとおして、ご自身のEnablementに繋がれば幸いです。

アーカイブ配信はこちらになります
https://youtu.be/AaJGqXAovpU?si=r5jQ-VXKnBsYgBBP
https://youtu.be/RTmoE0sDcZY?si=uF-rJNKI4cJiIVfI

Triple-WIN アンケート

Encraft では、参加者のアンケート回答に連動してナレッジワーク社が OSS プロジェクトに寄付をする試みを行っております。参加者の1回答当たり8ドルをナレッジワークが OSS に寄付することで、参加者と OSS プロジェクトをナレッジワーク社が繋ぐ仕組みです。
今回は26名の方がアンケートに回答してくださり、208ドルを open collective 経由で tiptap プロジェクトに寄付いたしました。

オフライン・オンライン問わず、ご回答いただいた皆様、ありがとうございました!

開催の様子

受付の準備をするスタッフ達

リモートで参加するtenntennさん

生徒の皆さん

懇親会の様子

次回予告

次回のEncraftは「LLMとエンタープライズの距離感」というテーマで行います。

2/28の19:00から開催予定になります。


Encraft は今後も定期的に学びと交流の場として開催を予定しています!

Connpass でグループメンバーになっていただけると開催通知メールが送られますので、開催を知りたい方は以下より是非グループメンバー登録をよろしくお願いします。

https://knowledgework.connpass.com/

セッションをオンラインでご覧いただいた方も、感想などハッシュタグ#encraftでツイートしていただけたら嬉しいです!

それでは、また次のEncraftでお会いしましょう!

株式会社ナレッジワーク

Discussion