2021-01-01から1年間の記事一覧

Vimのterminalでパイプを使う

vim

この記事はVim Advent Calendar 2021の9日目の記事です。 Vimにterminal機能が追加されてずいぶん経ちましたが、普段はtmux上でVimを使っていたので実際のところ使用頻度はそんなに高くありませんでした。 たまに使った時は出力がVimの中に閉じているため、…

Goのモジュールを個別に更新する

Go

特に問題なければ go get -u ./... で全て更新してしまうのが楽ですが、更新できないモジュールがある場合は個別に更新する必要があります。 go list -m -u all で全モジュールとその更新有無を確認できるため、 -f でgo getコマンドを出力するようにし、必…

aws-sdk-go-v2をモックせずにテストする

Go

テストでaws-sdk-go-v2を使う場合はドキュメントにある通り、Clientのモックを用意するのが一般的な手法かと思います。 ただテストのためだけにinterfaceを書きたくないので、aws-sdk-go-v2が提供するClientをそのまま使える形にしたいです。 幸いaws-sdk-go…

xorm.EngineGroupで複数のDBをまとめる

Go

データベースをWriterとReaderで分けている時、xorm.ioのEngineGroupを使うことでどちらのDBを使うのかを任せられるようになります。 使い方は通常のNewEngineと似ていて、NewEngineGroupの第2引数に接続先をスライスで渡します。 接続先のスライスは1番目が…

goplsと静的解析を活用して変更の影響範囲を調べたい

Go

1000パッケージ弱あるような巨大なリポジトリだと、関数1つの修正でどこまで影響があるのかを調べるのが結構大変*1だったりする。 Vimプラグインを作ったり、goplsを魔改造してみたりしてみたものの、使う人や環境を選ぶし、実行速度もイマイチだったのでも…

goplsのdaemonモードを使う

Go

goplsはgopls -listen=<addr>で実行するとdaemonモードで起動し、指定した<addr>でTCP接続できるようになる。 github.com クライアントはgoplsを使っても良いし、独自に実装することも可能。 その場合、TCP上で以下のような形式のJSON-RPCを送受信すれば良い。 (改行は\r</addr></addr>…

xorm更新用のテストを静的解析で生成した時のメモ

Go

前に書いた↓を使ってxormのバージョンを上げようと思っていたけど、生成されるSQLがおかしくなることがあると聞いたのでさらにテストを拡充することにした。 daisuzu.hatenablog.com といってもまだ完成していないので、ここまでやったことを備忘録*1として…

みんなで書くGoのエンドポイントテスト

Go

Webアプリケーションサーバーに何か大きな変更をしたいけど、既存のテストだと心許なかったので各エンドポイントにHandlerからのテストを追加することにした。 ただ全部のテストを自分1人で作っていくのはボリューム的に現実的ではなかったので、どうしたら…

GoのWebアプリで見かけたツラいコード

Go

構造体のフィールドにContextを持たせる Contextの中に参照を入れておいて任意の場所で更新する 似ている処理を匿名の構造体でまとめる 構造体のフィールドにContextを持たせる ほとんどの場合、各メソッドの引数にいちいちctxを渡すのが面倒だという理由だ…

vim-lspのCallHierarchyをツリーっぽく表示する

vim

リファクタリングしたりコードを調べたりする時、呼び出し元を探すのにLspReferencesやLspCallHierarchyIncomingを使っていた。 ただ、どちらも1階層分しか表示してくれず、呼び出し元が遠いと影響範囲が把握しにくかったのでquickfixに結果をマージして表示…

go/analysisのSuggestedFixでコードを修正する

Goの既存コードを修正するツールを作る時、 既存コードをどう書き換えて 出力して テストするか を考えなければいけないのが少し面倒だと思っていました。 が、golang.org/x/tools/go/analysisのSuggestedFixを使えばすごく簡単にできてしまいます。 golang.…

go-cmpでmap[string]interface{}のJSONを比較する

Go

GoでJSONを扱う際、型を定義せずに map[string]interface{} を使いたくなることがあります。 var ( a = map[string]interface{}{ "data": map[string]interface{}{ "value": int64(1), }, } b = map[string]interface{}{ "data": map[string]interface{}{ "v…