まえがき Go 1.23でiteratorが導入されました。 https://tip.golang.org/doc/go1.23 話題になっていたので見てみたんですが、少し見ただけでは、使い方、何を解決するのか、なぜこういう仕様になっているのかが分からなかったので調べました。それで分かったことの自分の理解をまとめます。 何を解決するのか Goのfor-rangeでは元々slice, map, channelなどをiterateすることは出来ましたが、これらの型で対応できない、より一般的な抽象化・統一化されたiterationの手段はありませんでした。具体的には、例えば bufio.Reader.ReadByte を用いてiterateすると以下のようなコードになります。 for { b, err := reader.ReadByte() if err != nil { if err ==
Go言語で構造体と構造体をマッピングする、いわゆるObject mapperを生成するCLIを書きました。 経緯 READMEに書いてる通りですが、いわゆるClean architectureなど多層構造のアプリケーションではどうしても似たようなオブジェクトを定義せざるを得ないことがあります。 特にキツい(?)のがgRPCを採用した場合ですね。 protocが吐く構造体は完全にprotobufに依存したものになっておりある程度層をまたいで同じオブジェクトを持っていくのは許容しよう、と割り切ってもこれをいわゆるドメイン層にそのままもっていくのは結構ハードルが高いのではないかと思います。 #あと、gogo/protobuf 亡き今、protoc-gen-goが非標準命名規則でソースコードを出力するのもキモチワルイ。。。 WEB上にいっぱいあるGo + gRPCのクリーンアーキテクチャサンプル的
GoReleaser と GitHub Actions を使って Go で作った CLI のリリースを自動化して、ついでに Homebrew でインストールできるようにするまでの手順メモです。 ちなみに先日、 Go で CLI を作る時に便利だったパッケージについて簡単に紹介する記事を公開しました。 こちらも興味があれば見てみてください。 検証環境 Go v1.19 GoReleaser v1.14.1 GoReleaser Action v4.1.0 GoReleaser とは GoReleaser は Go プロジェクトのリリースを自動化するツールです。 GitHub・GitLab・Gitea へのリリースの他、 Linux パッケージや Homebrew Taps の作成など、 Go プロジェクトのリリースに関する様々なタスクを自動化することができます。 基本的には CI 上で実行さ
Goのloggerを引き回す際に皆さんはどのような手法を取っていますか? グローバル変数にloggerのインスタンスを入れておく contextにloggerのインスタンスを入れておく トレースIDなどを入れたloggerを適宜作ってcontextに格納する 構造体のフィールドにloggerのインスタンスを入れておく(DI) などなど、ソフトウェアの規模や特性を鑑みて各自使い分けているかと思います。 ところで、私は 2. 3. の手法があまり好きではありませんでした。単純に面倒だし美しくありません。contextに入れる、取り出すだけでも数行のコードを毎度書く必要があってダルいな〜と思っていました。けれども、ログにトレースIDなどを入れたいだろうなあと思い、Webサーバの実装においては 2. を渋々選択していました。 さて、Go 1.21ではslogパッケージが登場しました。slogは単に
ライブリッツの筒井です。 GoのORマッパー連載、おまけ記事です。 特に示し合わせた訳では無いのですが、RDBは全員がPostgreSQLを使っていましたね。 さて、今回の連載記事のいくつかでも言及されていた、jackc/pgx について簡単に紹介します。 GoとPoatgreSQLでCOPY GORM v1 と v2 のソースコードリーディングしてみた GoでのPostgreSQLドライバは lib/pq が定番でしたが、現在その開発は消極的で今後機能が追加されることはめったに無いそうです。 https://github.com/lib/pq#status 一方 pgx は現在も活発に開発がなされており、GORM v2にも採用されています。 使い方の比較lib/pq (およびdatabase/sql)と pgx の使い方を比較していきます。 pgxはドライバだけでなく database/
Testcontainersを用いてテスト実行前の docker compose up を無くし、Goで並列テストする 春の入門祭り2024の1記事目です。 はじめにTIG真野です。 Testcontainers を用いて、単体テスト実行前に docker compose up -d 無しで、PostgreSQLにアクセスする単体テストを行う、入門記事です。 恩恵は次のような開発者体感の向上が個人的にあります。 テストを実行するうえで、別プロセスのサービスを起動しておく必要があるといった前提条件を考えなくても済むため、テストを行うビジネスロジックに集中できる docker compose up -d 打たないだけだが、テストに必要なコンテナを考慮しなくても済む 停止し忘れて、別のリポジトリの開発するときに混乱しなくても済む 並列テストしやすくなるので、テストの実行速度が向上する Goにおい
docker/compose は Go で書かれてるが、これのテストに gotest.tools というライブラリが使われていた。あまり見たことがなかったけど、使ってみたらわりと手触りがよかったのでここに記しておく。 gotest.tools はいつもの testing パッケージを拡張するようなライブラリ集。あとテストを実行するための CLI も提供している。GitHub Org は gotestyourself という名前だけど、これは洒落てるのかどうか不明(洒落てないほうに賭ける)。 assert, cmp gotest.tools/v3/assert が多分このライブラリのコア。主な API は assert.Check(t, comparison, msgAndArgs...) で、シグネチャを見たらあーそういうやつねと分かると思う。 予想通り comparison の中身しだい
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く