GoでREST APIを呼ぶテストにhttp.FileServerを使う
例えばGET /users/:idのようなAPIの場合、testdata └── users └── 1のように、testdata配下のusersディレクトリにidをファイル名としたJSONファイルを配置しておきます。そうすると、http.FileServer(http.Dir("testdata")) で、testdata配下のパスとリクエストのパスが一致するファイルが存在すれば200...
View Articlegopls(v0.4.0)の機能
goplsは更新頻度が高く、何ができるのかをちゃんと把握できていなかったので、LSPのメソッドベースで今の時点(v0.4.0)の機能をざっと調べてみることにしました。補完(textDocument/completion)ジャンプ系textDocument/definitiontextDocument/typeDefinitiontextDocument/implementationtextDocum...
View ArticleGoでprotobufの定義をimportせずにフィールドの値を使う
以下のようなコードでreqにあるフィールドを使いたい場合、opt := grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption)...
View ArticlegoplsのSymbolMatcherとSymbolStyleオプション
以下の記事で、workspace/symbolのオプションは補完と同じmatcherと紹介したが、現在のv0.4.4ではsymbolMatcherとsymbolStyleになっている。...
View ArticleISUCON10に初参戦してみた
ゴリラさんと出てみようと話していたものの、申し込みのタイミングを逃してオワタと思っていたら@inductorさんに拾ってもらい、カンガルーと犬とゴリラとしてなんとかISUCON10に参加することができました。当日は開始ちょっと前*1にDiscordとGoogleドキュメントでコミュニケーションすることを決め、...
View ArticleGoでDBのテストにgithub.com/cockroachdb/copyistを使う
久しぶりにMySQLを使ったシステムを触ることになったものの、現状のテストが遅すぎたので高速化に取り組むことにした。遅い原因としては、テストでDBを使うパッケージが多いので接続時間がそれなりになってしまうテストケースごとにTRUNCATE→INSERTでデータを入れ直しているといったところ。なので今回はDBにアクセスしないでテストができるようになるcopyistを試してみようと思う。github.c...
View Articlego-cmpでmap[string]interface{}のJSONを比較する
GoでJSONを扱う際、型を定義せずに map[string]interface{}を使いたくなることがあります。var ( a = map[string]interface{}{ "data": map[string]interface{}{ "value": int64(1), }, } b = map[string]interface{}{ "data":...
View Articlego/analysisのSuggestedFixでコードを修正する
Goの既存コードを修正するツールを作る時、既存コードをどう書き換えて出力してテストするかを考えなければいけないのが少し面倒だと思っていました。が、golang.org/x/tools/go/analysisのSuggestedFixを使えばすごく簡単にできてしまいます。golang.org/x/tools/go/analysisは...
View Articlevim-lspのCallHierarchyをツリーっぽく表示する
リファクタリングしたりコードを調べたりする時、呼び出し元を探すのにLspReferencesやLspCallHierarchyIncomingを使っていた。ただ、どちらも1階層分しか表示してくれず、呼び出し元が遠いと影響範囲が把握しにくかったのでquickfixに結果をマージして表示するコマンドを作ってみた。command! AppendCallTree call...
View ArticleGoのWebアプリで見かけたツラいコード
構造体のフィールドにContextを持たせるContextの中に参照を入れておいて任意の場所で更新する似ている処理を匿名の構造体でまとめる構造体のフィールドにContextを持たせるほとんどの場合、各メソッドの引数にいちいちctxを渡すのが面倒だという理由だけで以下のようにしている印象がある。type S struct { ctx context.Context } func (s *S) A()...
View Articleみんなで書くGoのエンドポイントテスト
Webアプリケーションサーバーに何か大きな変更をしたいけど、既存のテストだと心許なかったので各エンドポイントにHandlerからのテストを追加することにした。ただ全部のテストを自分1人で作っていくのはボリューム的に現実的ではなかったので、どうしたらチーム全員が書きやすいテストになるか考えて色々と整備してみた。テストの書き方がある程度決まっている期待する結果(want)を全て書かなくても良いテストの前...
View Articlexorm更新用のテストを静的解析で生成した時のメモ
前に書いた↓を使ってxormのバージョンを上げようと思っていたけど、生成されるSQLがおかしくなることがあると聞いたのでさらにテストを拡充することにした。daisuzu.hatenablog.comといってもまだ完成していないので、ここまでやったことを備忘録*1として残しておいて続きは連休明けにやる予定。方針としてはxormがDBのドライバーを呼んだ際のクエリを記録・比較できるようにし、それを実行す...
View Articlegoplsのdaemonモードを使う
goplsはgopls -listen=<addr>で実行するとdaemonモードで起動し、指定した<addr>でTCP接続できるようになる。github.comクライアントはgoplsを使っても良いし、独自に実装することも可能。その場合、TCP上で以下のような形式のJSON-RPCを送受信すれば良い。 (改行は\r\n)リクエストContent-Length:...
View Articlegoplsと静的解析を活用して変更の影響範囲を調べたい
1000パッケージ弱あるような巨大なリポジトリだと、関数1つの修正でどこまで影響があるのかを調べるのが結構大変*1だったりする。Vimプラグインを作ったり、goplsを魔改造してみたりしてみたものの、使う人や環境を選ぶし、実行速度もイマイチだったのでもっと使い勝手の良いものが欲しかった。そこでPull...
View Articlexorm.EngineGroupで複数のDBをまとめる
データベースをWriterとReaderで分けている時、xorm.ioのEngineGroupを使うことでどちらのDBを使うのかを任せられるようになります。使い方は通常のNewEngineと似ていて、NewEngineGroupの第2引数に接続先をスライスで渡します。接続先のスライスは1番目がWriter、2番目以降がReaderになります。xorm.NewEngineGroup(driverNam...
View Articleaws-sdk-go-v2をモックせずにテストする
テストでaws-sdk-go-v2を使う場合はドキュメントにある通り、Clientのモックを用意するのが一般的な手法かと思います。ただテストのためだけにinterfaceを書きたくないので、aws-sdk-go-v2が提供するClientをそのまま使える形にしたいです。幸いaws-sdk-go-v2はClientをカスタマイズするためのオプションがあるため、大別して以下の2つの方法で実現可能です。1...
View ArticleGoのモジュールを個別に更新する
特に問題なければ go get -u ./...で全て更新してしまうのが楽ですが、更新できないモジュールがある場合は個別に更新する必要があります。go list -m -u allで全モジュールとその更新有無を確認できるため、 -fでgo getコマンドを出力するようにし、必要なものだけ実行すると楽です。例えばgoplsはそのまま実行すると以下のようになりますが、$ go list -m-u all...
View Articlego-cmpでmap内の時間文字列を近似比較する
以下のような関数をテストする際、期待する値もtime.Now()で生成して概ね問題ない。func f() map[string]interface{} { returnmap[string]interface{}{ "time": time.Now().Format("2006-01-02 15:04:05"), } }...
View Articlegolang.org/x/exp/jsonrpc2を使ってgoplsに接続する
最近golang.org/x/expにjsonrpc2が追加されていることを知ったので試してみた。 pkg.go.dev基本的な使い方としてはDialでConnectionを作成し、レスポンスが返ってくるメソッドはCall +...
View ArticleQNAPをTS-233に移行した
今までTS-231を使っていたけど、たまに落ちることがあったり去年ついにサポートが切れてしまったのでTS-233に移行した。手順はTS-231の電源を落として、HDDを入れ替えて、TS-233を起動するだけ。起動後は固定IPにしていたのがDHCPになっていた*1のでQfinderで探し、一応IP設定を戻しておいた。それ以外はデータもアカウントもそのまま引き継がれていたので特に何もしなくて良かった。*...
View Articlegoplsに独自Analyzerを組み込む
internal/lsp/source/options.goのdefaultAnalyzers()が返すmapに自作のAnalyzerを追加してgo...
View ArticleGoの外部パッケージに独自の変更を加える
外部パッケージを使っていて、ちょっとした修正を試したい時は以下のような方法があります。1. 外部パッケージをForkしてgo.modで置き換える2. 外部パッケージのコピーをリポジトリに追加してgo.modで置き換える3. 変更したファイルをリポジトリに追加してoverlayで書き換える1....
View Articlemacvimをビルドする(2023/08)
だいぶ前にも書いていた。daisuzu.hatenablog.comここ最近は毎朝UpdateMacVimを実行している。*1UpdateMacVim() {cd$HOME/go/src/github.com/macvim-dev/macvim git fetch origin master if [-z"`git diff FETCH_HEAD --shortstat`"];thencd -...
View Articlegithub.com/swaggest/openapi-goを使ってOpenAPIを生成する
github.com/swaggest/openapi-goを使うとGoのコードからOpenAPIの定義(json/yaml)を生成できる。pkg.go.dev例:package main import ( "encoding/json""fmt""log" openapi...
View ArticlegnosticでOpenAPIをProtocol Buffersに変換する
gnosticとgnostic-grpcを使えばOpenAPIの.yaml(.json)を.protoに変換できる。github.comgithub.com1. gnosticをインストールする2. gnostic-grpcをインストールする3. 変換する1. gnosticをインストールするgo install github.com/google/gnostic@latest 2....
View ArticleVimConf 2023 Tiny に行ってきた
昨日(11/18)はVimConfに行ってきました。前回が2019年だったので実に4年ぶりの開催でした。vimconf.org2017年から2019年は3回ともスピーカーでしたが、今回は久しぶりの一聴衆でした。なので当日は全く緊張する必要がなく、とても穏やかな気持ちで参加することができました。また、休憩時間や懇親会などで久しぶりに会えた人と話をすることができ、とても懐かしい気持ちになりました。そして...
View Article