golang

goで直接reflectを使わずinterfaceを含んだstructをJSONでencode/decodeする方法

この記事はGo Advent Calendar 2021 4の19日目の記事です1。 goのencoding/jsonの機能はそこまで柔軟ではない。どこかで諦めたほうが良い事が多い2。 とはいえ、いろいろなことを柔軟にやってみる方法を検討してみるのは良いことなので検討してみる。 interf…

net/httpのhandlerにdbなどの依存を持ち込む方法のメモ

昨日の記事のついでに色々goでのwebプログラミングに関する初歩的なことをメモしておこうと思った。 net/httpのhello worldから始めてどういうタイミングでどのライブラリが必要になるかのメモ - podhmo's diary 今回はhandlerに依存を持ち込む方法のメモ。 …

net/httpのhello worldから始めてどういうタイミングでどのライブラリが必要になるかのメモ

goを始めたばかりの人の質問に対して以下の様な記事や回答はまれによく見る(自分自身もそのように答えることはままある)。 Goのおすすめのフレームワークはnet/http | フューチャー技術ブログ とはいえ、ある程度煩雑になってくるとライブラリなどを追加した…

fmt.Errorf()でのerrorのwrapはpkg/erorrsのCauseを壊してしまうので注意

どちらか一方に統一されていた場合には困らないが、混在している環境での動作のメモ。 特に、トップレベルでerrors.Cause()を使っている処理が存在していると危険かもしれないという話。 実験 テキトーに以下のようなコードを書いてみる。直接エラーを返すも…

goでfunc()(object, func(), error)のようなファクトリー関数の扱いについてのメモ

何かのファクトリーを統一的に扱いたいみたいなことを考えたときにそれへの対応を考えることがある。 goの場合はそれぞれの状況で自分の手でコードを書いてつなげなくてはいけない。ファクトリーに限らないがこの種のバリエーション自体に言及しているのはwi…

goでテスト用にhttpの通信を失敗させたかったのでその方法のメモ

たまにエラー時のハンドリング部分のテストが書きたくなることがありますね。例えば、通信の記録のような操作を書いているときなどに。 こういうときに人為的にエラーを発生させる方法を調べたのでメモをしておこうと思います。 タイムアウト分待つ まずはじ…

goでflexibleな実装の選択のためのちょっとしたパターンのメモ

前回の記事でxormのコードを読んでいたときに、flexibleに実装を選択するためのパターンがあったことを思い出したのでそのメモ。 flexibleな実装の選択? 実装の選択と言っても、DI的な話ではない。デフォルト実装と拡張の実装の間を自由に行き来できるよう…

sqlx/reflectxを触ってて、他のRDBMS関係のライブラリのcreate table部分の実装が気になったので調べてみたメモ

これは自分用のメモです。 github.com goでRDBMSを触るときに、sqxは機能が小さくて良いのですが、手元で実行例的なコードを書くときに、SQL側のtable定義とgo側のstructの定義を書いたりするのが面倒になることがあります。実運用はともかくとして、ちょっ…

同じシグネチャを持つ異なる関数たちのreflect.Typeのidentityについて

シグネチャが同じ関数のreflect.Typeが一致することに気づかずハマったりしていた1。 package main import ( "fmt" "reflect" ) type Foo string type Bar string type Alias = string func Hello(string) string { return "" } func Byebye(string) string …

reflect-openapiにswagger-uiを組み込んだ

github.com この記事の続き。いろいろ変更を加えてswagger-uiを組み込んだ。 goで作られた既存のweb APIに後付けでopenAPI docを付けたかった これまでのreflect-openapi 以下のような "Hello " と返すだけの関数を公開する。 type HelloInput struct{ Name …

goでassemblyを見たいときに can't find import <package>

例えば以下のようなファイルがあるとして。assemblyを覗きたいときに go tool compile を使おうとする。 $ tree . ├── Makefile ├── go.mod ├── m.go └── main.go 0 directories, 5 files 上手くいかない。 $ go tool compile -S -N main.go main.go:6:2: ca…

そのstruct、実は不要になるかもしれません

これはGo Advent Calendar 2020の3日目の記事です。 とりあえずで登録してしまったので、特に肩に力の入った力作などは用意してないです。この記事は、本来のアドベントカレンダーの趣旨に沿った(?)ちょっとした内容の記事にしようと思います。 はじめに…

goのflagで@<filename>と言う形式ならファイルの中身を利用するValueを作ってみる

ちょっとだけメモ。 最近は、標準ライブラリのflagだけで生活できるような気がしている。 まぁそれはおいておいて、例えば、curlなどで使われている@<filename>と言う表記で、ファイルの中身を取り出すvalueが欲しくなった。その実装のメモ。 flag.Value flagパッケー</filename>…

functional optionsの整理。interfaceにすることの意味について。

goのfunctional optionsに対する自分の理解と、いわゆるoption部分をinterfaceにしておくことの意味について考えてみる。 functional optionsについて まずはfunctional optionsについてのおさらい。functional optionsはoptionalな引数をいい感じに受け取る…

goで作られた既存のweb APIに後付けでopenAPI docを付けたかった

github.com 最近、reflect-openapiというパッケージを作っています。まだまだ荒削りですがある程度動く感じにはなったので紹介します。 goで作られた既存のweb APIに対してopenAPI docが見れるようにしたい、というの作りはじめた動機です。 なんで新しく作…

いろいろなビルド用の分岐にタグを使ってみる(例えばlambda用のビルド)

いい感じにできないか考えたりしていた。アイデア段階で途中だけど途中経過をメモ。 TODOアプリを模したコードがあったとして、以下の様な操作が提供されているとする。 type TodoApp interface { List() ([]Todo, error) Add(todo Todo) (Todo, error) } こ…

goでSQLのquery logを出力させるのにsimukti/sqldb-loggerが便利かもしれない

github.com goでRDBMSを利用したコードを書いているときに、実際に発行されたqueryを知りたいことがある。特定のORMやquery builderでは対応していて何らかの設定を追加すると見えるものがあるが、そもそもquery logの出力に対応しているかどうかを判別する…

httptest.ResponseRecorderを使っていてもRoundTripperを使いたい

時折、テスト中にRoundTripper (client.Transport) を挟んで良い結果を得ようと企む事がある。コレに対応可能なのがhttptest.Serverを利用した通信のときだけだと思っていたけれど。一手間加えるとRecorderを利用したテストでも対応可能な事に気づいたのでメ…

巷で見かけるClean Architectureのコード例に対するモヤモヤについて

たまにはふわっとしたことをふわっと書いてみるかということで書いてみた。 はじめに Clean Architectureについての記事をたまに見かけることがある。多くは自分の馴染んだ言語でこのように実装してみましたと言う例なのだけれど、多くの場合にモヤモヤを抱…

web APIのテスト時に500のときにはstack traceを表示したい

通常、status codeが500のresponseにstack traceなどが含まれているとセキュリティ的にはよろしくない。そんなわけで500のresponseは簡素な表現になる。一方でテストのときなどに、簡素な表現だけが表示された場合には、stack traceを含めたい。含めない場合…

go-chi/chiでJSON logを手軽に使う方法

go-chiは、あまり素のnet/httpからかけ離れたラッピングを行っては居ないので、goでのweb APIの取扱を考えたりするのに便利なのですが、本番運用のことを考えるとJSON logが欲しくなったりしますね。 go-chiのloggerミドルウェアの出力は綺麗なのですが、こ…

go-chi/chiの動作確認時に最初に書くコード

個人的には、細々としたコードの動作確認のために小さな1ファイルのコードを書くということを常々やっている。頭があまり良い方ではないので、ドキュメントを読んだだけでは実際の動作を正確に理解することができない。加えて微妙な差異を追加しての比較検討…

fmt.Errorf()とerrorsのセットとgolang.org/x/xerrorsは異なる

前回の記事でfmt.Errorf()がpkg/errors.Wrap()を殺すという話を書いた。これはもう少し雑に言えば、エラー時に位置情報を記録したいということだった。 そしてこれについて以下の様な発言をしつつ調べていたところ、かつてのpolyfilだと思っていたgolang.org…

fmt.Errorf(" : %w", ...)は、pkg/errors.Wrap()を殺す

go1.13以降、github.com/pkg/errorsから、標準ライブラリのerrorsとfmtを使う形への乗り換えが行われていたり行われていなかったりする1。 乗り換えの方法についてはerrors.Is()やerrors.As()の使い分けに終止している事が多い気がする。それ以外の変更点で…

goのerrors.As()でpanicしちゃう話

ドキュメントに書いてあることだけど、渡し方をミスるとerrors.As()はpanicしてしまう。 As panics if target is not a non-nil pointer to either a type that implements error, or to any interface type. errors.As()の使い方 その前に errors.As()の使…

go testのtest.testlogfileフラグが時々便利

test.testlogfileを付けてテストを実行すると、テスト中の以下が分かる。 os.Stat()したファイル os.Open()したファイル os.Getenvした環境変数 これは、例えば、net/http.FileSystemが使われた様なテストなどで苦しめられたときに便利に働くことがある。 例…

goでdeprecatedな関数の利用に対してwarningを出すlintの使い方のメモ

github.com 適切にDeprecated:という修飾を含んだコメントを追加すると、その関数を利用した際に、以下の様なwarning messageが出るようになる1。 main.go:8:2: greeting.Hello is deprecated: use HelloWithContext() (SA1019) これの使い方のメモ。 Deprec…

go-vcrを使ったSymmetric API Testingのメモ

github.com go-vcrを使おうとしてみたのでそのメモ。 Synmetric API Testing? Symmetric API Testingという言葉は、この記事が使っている言葉のよう。 https://blog.gopheracademy.com/advent-2015/symmetric-api-testing-in-go/ 単純に言えば、通常は何らか…

goでreflectを使ってunexported fieldの値を見る

テストなどのhelperを作るときに、特定のstructのunexported fieldにアクセスしたくなることがある。 その方法のメモ(あとでまじめに書くかもしれない書かないかもしれない)。 with exported field その前にreflect経由でのアクセスで考えてみる。以下の様…

goで手軽にencoding/json感覚でdotenvと環境変数を使う方法のメモ

以下2つのライブラリを使うと便利 github.com github.com joho/godotenvは、いわゆる.envファイルをいい感じに読み込んでくれるもの。 caarlos0/envは、encoding/json感覚で書いたstructのタグからいい感じに読み込んでくれるもの。 利用例 例えば、以下の…