Go Conference mini 2023 Kyoto
Deep dive into log/slog package
いろいろなログパッケージが開発されていった
ログレベルは飛び飛びなintの定数
anyの代わりにValue structを使うほうが少しだけメモリ効率がいい
nAttrsInline == 5
9割ぐらいのロガーが5個のker-value pairを出力していた
Goプログラムがビルドされるまで(コンパイラーの仕組みを探る)
CとGoのバイナリを比較
システムコールが多い
Goのランタイムがある
公式コンパイラ以外もある
実装が仕様になるのを防ぐ
GOSSAFUNC=main go build
Goにおけるcall graphを用いた大規模コードベースの影響調査
データマイグレーションにおける影響調査
属人化しがち
コンテンツモデルリニューアル
バラバラになっているコンテンツを、見やすいように1つにまとめたい
サービス全体に影響
固有名
リポジトリをまたいでいる
entityに着目
DDDライクなレイヤードアーキテクチャ
golang.org/x/tools/go/callgraph
画像生成が重いのでコメントアウト
networkx
entityの参照一覧取得を自動化したい
LSPのロジックを元に実現できないか
Parsing case study in Go
bufio
Scanner
SplitFunc
パケットの解析
特定目的のパーサーライブラリを活用
日時処理の新スタンダード: Synchro によるタイムゾーン安全、楽々開発
タイムゾーンを型に埋め込む
ISO8601
いろいろある
実装に対してテストが最大4倍
Period
Go1.22で導入予定だったzeroというbuilt-inについての紹介
untyped build in zero
short zero
acceptedからdeclinedに戻るのは特異なケース
詳細を詰める時間がないのでweak declined
Go Getでのchecksum不一致に遭遇した話とその対応
GOPROXY=direct go get github.com/replu/eto@v0.0.1 で確認できる
checksum serverのchecksumは更新できない
proxy.golang.org
キャッシュが消えることはある
sum.golang.org
一度計算したら消えない
CUE+Goで安全かつ簡単に設定ファイルを自動生成してみた
PipeCDのYAMLファイルを自動生成
context.WithoutCancelについて語る
タイムアウト設定がシビアなときに使う
context.WithTimeoutで囲んで使う
uber-go以下に似たようなやつがある
Golangを使ったDB用負荷テストツールの開発
クエリログをテストのシナリオに使う
goroutineでchannelを待って、親でcloseすることで一斉実行
インターフェースのラッパーを作る際の落とし穴
http.ResponseWriterでレスポンスサイズを計測する
struct embedding?
内部的に型アサーションを使って分岐するところでうまくいかない
全部実装する?
下手に作るとpanicする
実装されているかどうかでもう一段ラップ
生成AIによる静的解析ツールの自動生成
生成AIをGoで試すハンズオン
go/analysis
スケルトンコード生成ツール
プロンプトエンジニアリング
The Future of encoding/json
encoding/json/v2
encoding/json の最初のcommitは2008年
機能不足
io.Readerからunmarshalできない
json.NewDecoderを使うと末尾に非JSONな文字列があっても許容されてしまう
パフォーマンス
[]byte を返す
ストリーミングになっていない
RFC違反・未定義
エラーハンドリングがムズい
jsontext
オプションがある
SyntacticError, SemanticError
MarshalWrite, UnmarshalRead
omitzero
encoding/jsonからencoding/json/v2へのマイグレーション
続) TinyGo で作る自作キーボードの世界
バックエンドはLLVM
encoding/jsonが動くようになった
レイヤー
Fnキーで切り替えるみたいなやつ
触って理解するGoコンパイラの最適化
ゼロサイズ型のオブジェクトはアロケーションされない
struct{}
map[string]struct{}
長さ0の配列
ゼロサイズの要素しか持たないstruct・スライス・map
変数代入によるアロケーションを回避する
比較
mapキー指定
byte走査
スライスのゼロ初期化
memclr
clear関数 (Go 1.21)
インライン展開が効いて速度差が出ない例
//go:noinline
エスケープ解析
ポインタはヒープに逃がされてGC管理になる
マークスキャン回避
ポインタがなければスキャンする必要がなくなる
開発チーム横断タスクフォース「Goサブ会」の運用事例と今後の展望
長いことPerlを書いていたが、Goが使われるようになっている
定石が知見として貯まっていない
PerlでできていることがGoでできていない
プロダクションで使うGo Pluginの利便性とパフォーマンス性
プラグイン
shared library
pluginパッケージ
プロセス間通信
CLI
kubectl
Git style
WARP
安定性とパフォーマンス
go-pluginができた理由
標準pluginの制約
ビルドするGoのバージョンを揃える必要がある
glibc依存
パフォーマンスは良い
WASMによるプラグイン
Revolutionising Inheritance with Generics: A Fresh Approach in Go
ジェネリクスを活用したい
交差型
embedded interface
net/http から net.Conn を掘り起こす
net/httpのClient, Serverがプールしているnet.Connにアクセスできない
プロトコルに破壊的変更を加えるとき
DialContext, ConnContextでcontext経由でやりとりする
PROXYプロトコル
GoとテストとインプロセスDB
DBを使ったテストの書き方
pure Go SQLiteがある
go-mysql-server
MySQL
ramsql
PostgreSQL
ブログのリアクションから始めるGoのパフォーマンス分析入門
cockroachdb/errorsは内部的にpkg/errorsに依存している
ベンチマークの取り方
GoのProtocプラグインを活用した効率的なgRPC負荷試験戦略
Protocol Buffer
あらゆるスキーマ定義にprotoを採用
全APIの単体負荷試験
実行シナリオとファイルを1:1にする
protoc-gen-star
作ってよかったgraceful shutdownライブラリ
起動はいいけど終了が難しい
記述量が多い
ボイラープレートを減らせた
クロージング
今昔物語
人・モノ・お金
行動するからきっかけが生まれる