emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go

Go で protoc のカスタムプラグインを書く

Overview なぜ protoc プラグインを自前で用意したくなったのか カスタムプラグインの作成 まとめ Overview protoc のプラグインを自分で書いてみたのでその備忘録です。 なぜ protoc プラグインを自前で用意したくなったのか ちょうど業務で RBAC 制御の実…

protoc のプラグインを go tool で管理・実行する

Overview buf.gen.yaml で local の protoc コマンドを hook して実行するときに go tool 経由で実行すると個人の環境差異にとらわれずに実行できて便利、という話です。 Motivation proto からコードを生成するときに、今では buf generate を利用するのが…

Go 1.24 から導入された json の IsZero に触れてみる

Go

Overview Go 1.24 から encoding/json に入った IsZero のインターフェースについて実際に触ってみて挙動を調べてみました。 IsZero とは? When marshaling, a struct field with the new omitzero option in the struct field tag will be omitted if its …

actions/setup-go で Go のバージョンを指定する

もともと GitHub Actions で Go のバージョンを指定するときは matrix 構文を使って go のバージョンを渡していた*1が、今は actions/setup-go で指定できるようになっていたことを知らなかった。 zenn.dev Go は下位バージョンとの互換性を保っていてくれる…

local で Cloud Pub/Sub の動作をエミュレートする

Overview ema-hiro.hatenablog.com 上記で書いた gRPC サーバーを local で立ち上げる方法を下に、local で起動したその gRPC サーバーを利用して pubsub の動作(今回は subscriber の動作)をエミュレートするテストを書いてみます。 local でテスト用の pu…

単体テストのために local で gRPC サーバーを起動する

Overview タイトルのとおりです。 このエントリは local で簡単に gRPC サーバーを起動して GCP のライブラリの簡易的な動作検証環境を整えたときの備忘録になります。 モチベーションとしては、単体テストと書いてますが、主に GCP のライブラリの動作を lo…

txtar コマンドで Go のファイルをテキストファイルにアーカイブする

Go

pkg.go.dev Go のファイルを text ファイルにアーカイブするコマンドが純正で用意されているということを教えてもらって初めて知りました。 以下のように使うと指定したディレクトリ配下の Go のファイルをすべて任意のファイル形式でにアーカイブ出力してく…

Go の range over func は nil で panic する

Go

Go 1.23 から導入された range-over func を使うときの注意点として、range にわたす iterator 型のメソッドは nil を返してはいけない、というものがありました。 具体的には以下のコードで range-over func にアサインしてる NilFn は返り値が nil になる…

Go の slices.Contains はカスタム struct の slice も比較できる

Go

ということを知りませんでした。 // You can edit this code! // Click here and start typing. package main import ( "fmt" "slices" ) type X struct { ID int Name string } type xarr []X func main() { x := X{ ID: 1, Name: "taro", } xx := X{ ID: 2…

AWS SDK for Go V2 で Endpoint Resolver の実装方法が変わった話

Overview タイトルのとおりです。 AWS SDK for Go V2 を使ってるケースで従来の Endpoint Resolver の実装方法が非推奨になり、新しい実装方法が公開されていました。 aws.github.io Endpoint Resolver とは? 文字通り AWS SDK 経由で AWS のサービスにアク…

Go で複数の文字を一括で別の文字に置換する

Go

Overview Go で文字列の中で特定の文字を別の文字に置換したいケース、例えば改行コードやタブが混じっている文字列の中で特殊文字だけをエスケープしたいケースなどで strings.Replace を多用するのではなく、一括で置換する実装について記載します。 strin…

httptest で server を立てるときに Port を固定する

Go

Overview endpoint のテストをするときに httpserver でサーバーを立ち上げて request と response の検証をする、ということをするときに、httptest で立ち上げるサーバーに割り当てられる port はランダムに決まります。 ただ、テストによっては port を固…

buf CLI を v1.32 以上に上げて設定ファイルを v2 にマイグレーションする

概要 タイトルのとおりです。 Buf CLI を最新(v1.36) にしたところ、v1.32 以上で大きな変更があった模様で、それに対応しました。 buf.build zenn.dev 対応 github.com ハマったところ 新しい Mac で作業していたところ、Connect (依存含め)を動かすための…

slices.SortedFunc の挙動を少し調べて疑問に思った話

Go

Overview Go1.23 で range-over func を取り込んだ slices package 内の SortedFunc と SortedStableFunc の挙動について少し調べました。 SortedFunc SortedStableFunc Sort における Stable とは? Godoc を読んでも完全には理解できなかったので ChatGPT …

Go1.23 の range-over func を使って高階関数を書いてみた

Go

Overview Go1.23 から導入される Iterator を使って Chunk 処理を書く - emahiro/b.log を書いた当日(日本時間だと翌日だけど)Go 1.23 が正式にリリースされていたので、サンプルとして range-over func を使った高階関数のセットを書いてみた。 Go 1.23.…

Go1.23 から導入される Iterator を使って Chunk 処理を書く

Go

Overview Sample Benchmark See Also Overview Go1.23 から導入される Iterator を使って同様に Chunk 処理を実装してみます。 Sample func chunk[T any](src []T, chunkSize int) iter.Seq[[]T] { return func(yeild func([]T) bool) { for i := 0; i < len…

semaphore を使って goroutine の起動数を Go から排他制御する

Go

Overview sync package 内にある semaphore を使って Go のアプリケーション側で goroutine の起動数を排他制御します。 Go の並行処理の起動数を制御するのは 使い方 https://pkg.go.dev/golang.org/x/sync/semaphore#section-documentation のサンプルにあ…

Go の iterator を触ってみた

Go

Overview 今月にもリリースされる予定の Go1.23 に同梱されている iterator package をだいぶ今更ながら触ってみました。 どういうものか、ということの概要は知っていましたが、まぁ一旦自分でも触ってみるか、ということで触ってみて、実際動かしながら触…

ogen が v1 になっていたので変わったところも含めて試してみた

サマリ 現職で OpenAPI からのコード生成ツールとして ogen を採用して使っているのですが、この ogen がしばらく見ないうちに v1 (現時点の最新は v1.2.1) に進んでいたので、v1 以前との違い等々を調べてみました。 github.com v1 以前と変わったところ 設…

Go Conference 2024 に参加してきた

Go

Go Conference 2024 に参加してきました。 個人としてはだいぶ久しぶりに大きなソフトウェアのカンファレンスに参加してきました。 コロナ禍でのオンライン開催での現地の熱気を感じれなくなったり、その後子供が生まれてそもそも週末に1人でなにかのイベン…

VSCode で delve を使った Debugger の環境を整える

Go

Overview Go + Delve の利用環境を VSCode について記載します。 動機 普段の開発ではずっと古き良き? print debug を使って動作確認を行ってきていました。 もちろん手元の開発だけでなく remote での動作確認等では今でもこれよりシンプルで一般的な手法…

cloud.google.com/go/bigquery.Query の結果を go test の中で mock する

Overview やること Query Operation の場合 ハマったところ BigQuery のライブラリでどの API を Call しているのかわからなかった。 BigQuery の API のレスポンスを生成する Overview BigQuery を使った実装をしているときに、API リクエストを mock した…

actions/setup-go で Go のバージョンを指定する

actions/setup-go は Go のバージョンを指定しないとデフォルトで Go1.20 が使われているっぽい挙動に出くわしたので Go のバージョンを指定する方法のメモ。 github.com 気づいたきっかけは local で使用してる Go のバージョンと CI (GitHub Actions 上)…

BigQuery のクライアントを Go で実装する

Overview Go で BigQuery のクライアントを実装する BigQuery のライブラリは 2種類ある BigQuery の型はそれぞれ Go で対応する形が決まっている カラム名とフィールド名は一致させる必要がある 余談: ValueLoader を実装すると独自型を BigQuery の型を pa…

go-cmp/cmpopts を使って map の特定の key のみをフィルタする

Go

Overview cmpopts.IgnoreMapEntries を利用する Ref Overview go-cmp を使って実際取得した値と期待値を比較するときに go-cmp/cmpopts を使って、二値の比較のオプションを設定することが出来ますが、この二値が map のときに map の中の特定の key に紐づ…

AWS Go SDK でのエラーハンドリングについて

AWS の Go SDK はその本体のコードを読もうとすると実装がものすごく抽象化されていて、慣れていないと実際のコードを追いかけることも結構難しい。 Go の実装でエラーの中身(型)を見て処理を変えたいケースやそもそもどういうエラーを返すのかを知りたい…

配列形式のクエリパラメータを受け取る実装について考えてみる

Go

Overview Motivation 実装パターンについて GET /user?id=1,2,3 のパターン GET /user?id=1&id=2&id=3&id=... のパターン GET /user?id[]=1&id[]=2&id[]=3&... のパターン RFC 3986 を見る まとめ Overview ID=1, ID=2,... のようにクエリパラメータで指定し…

gonew コマンドを試してみた

Go

Overview gonew とは? gonew を使う まとめ See Also Overview gonew コマンドを触ってみたので備忘録です。 go.dev gonew とは? 既存の Go のプロジェクトからコピペで作らずに、そのプロジェクトをテンプレートとして新規の Go プロジェクトを始める事が…

cockroachdb/errors でスタックトレースを取得するのが良さそうだった

Go

Overview Go でエラーハンドリングするときにどこでエラーが発生したのかわかるように StackTrace を取得して、エラーメッセージと一緒に出力したいケースがあると思いますが、Go でStackTrace を取得するのはひと手間かかります。 「Go スタックトレース」…

http.Request をコピーする

Go

Overview どういうケースか? 結論: Clone してから Body に詰め直す まとめ Overview Go の http.Request を二度読み込みしたいケースでハマったのでその備忘録です。 どういうケースか? API を書いていると認証・認可等のAPI全体に関わる共通の前処理を m…