golang

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のタグからいい感じに読み込んでくれるもの。 利用例 例えば、以下の…

コード生成におけるN+1問題とbulk actionとしてのegoist。あるいはMakefileについて。

例えば以下の画像の様な依存関係でコード生成1が行われるとする。入力となるファイルが幾つかあり、例えばjinja2のテンプレートなどで出力先の表現が記述されていて、これによりちょっとしたgoのコードやopenAPI docの一部を生成するというようなタスク。 画…

pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成する

github.com pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成してみる。(より細かなバリエーションは https://github.com/podhmo/egoist/tree/master/examples/e2e/generate-structkit にある) なぜUnmarshalJSON()付きで…

egoistで生成するCLI定義のカスタマイズ方法について

github.com 作っていたミニフレームワークの最初のバージョンをリリースしたと言う話という記事を書きました。 goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした とはいえ、この記事だけだと何が何だか分からなかったので、作…

goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした

github.com 以下の記事のミニフレームワークのプロトタイプが動くようになったので、0.0.1をpypiにアップロードしました。 goはランタイムという発想のミニフレームワークを作り始めた このプロトタイプに含まれる機能はCLIの定義を手軽にすると言う部分です…

errorをmapで保持する小さなerrorライブラリを作った

github.com errorをmapで保持するライブラリを作った。いわゆるmultierrorのような複数のエラーをsliceとしてまとめるライブラリは存在するのだけれど、意外とmapで保持するライブラリがなかったので。代わりのライブラリがあるならそちらを使いたい。 なぜ…

goで文字列ベースのenumの定義はこんな感じが良いかもしれない

文字列ベースのenumの定義で良さそうなコードができたのでメモ(iotaを使った数値がベースのものではない)。 文字列ベースのもの 個人的には、特に速度やメモリーなどのことを気にしない場合には、文字列ベースのもののほうが取り回しやすくて良いと思って…

goはランタイムという発想のミニフレームワークを作り始めた

goはランタイムという発想のミニフレームワークを作り始めた。まだ全然完成はしていないけれど、どういう方針で作っているかなどをメモをしておく。 github.com フレームワークと言いつつ、現状ではそこまでいろんなことをやってくれるという感じではない。…

goのflagパッケージは-xxxだけでなく--xxxにも対応していることを知った

-nameというオプションを持つようなコマンドを作ってみるとヘルプメッセージは以下の様になる。 $ go run main.go -h Usage of app: -name string name of person (default "foo") 素直にヘルプメッセージを読むと使えるのは、-name <value> と -name=<value> だけ。 実際</value></value>…

goでadditionalProperties:trueのように余分なデータを保持したままJSONをmarshal/unmarshalする良い方法がみつからない

時折、余分なデータを保持したままJSONをmarshal/unmarshalしたくなることがある。例えばwebAPIを利用するときなどに、すべてのフィールドを記述するのは面倒だけれど、新しく増えるフィールドの存在に気づかず欠損してしまうのは避けたいみたいな状況。 内…

新しいgithub CLI toolのghコマンドが更新チェックをいつ行っているのか気になったので調べた

github.com 最近githubがhubの代わりにghという新しいgithub用のCLIツールを出していました。cli/cliという位置にあるので組織名とリポジトリ名がすごい。特等席。 例えばmacでは以下の様な形でインストールすると、このghコマンドが使える様になる。 $ brew…

goで設定ファイルを読み込むときに上書きしたい

goで設定ファイルを読み込むときに設定の一部だけを上書きしたいことがある。それ用のコードのメモ。 github.com mergo? mergoというのはけっこう古くからあるライブラリみたい。 A helper to merge structs and maps in Golang. Useful for configuration d…

goで想定した実装が1つだけのときに、テストのためだけにインターフェイスを書きたくない

この話に似た話。type aliasを使った型の読み替えで手抜きができる(場合がある)。 テストのためだけにインターフェイスを書きたくないでござる リンク先の記事はtype aliasを使って同一パッケージ上にimportしてくる。 そしてテスト中はmockの方にビルドタグ…

最近のgoでCLIのコマンドを作るときの雛形のメモ (updated)

昔にも似たような記事を書いていたみたいだった。最近のgoでのCLIツールを書く際の心境の変化があったのでその辺をメモしておく。 最近goでCLIのコマンドを作るときの雛形のメモ 心境の変化 心境の変化は2つ コマンドラインオプションをstructで囲む理由が…

goでpkgパッケージを作りたくなる派の意見

個人的にはpkgパッケージを作ることにわりと肯定的な立場なので思ったことをメモしておくよ。 pkgパッケージが作られる理由 pkgパッケージを作りたいと思う理由は以下だよ。 pkgパッケージはmonorepoの小さい版と解釈すると納得できる 公開されたパッケージ…

まじめにgoでDIを考える前のメモ

そろそろDIについてもまじめに考える必要が出てきたので考えることにする(この記事では終わらない)。たまには答えになっていないようなメモでも。 何となく最近思うのは、goゆえの制約はあっても、goだからで省略できる特別なことは特に無いなということ(…

現在時刻のような実行の度に値が変わるようなresponseを含んだAPIのテストについて

github.com 昨日に引き続きgo-webtestの話。 現在時刻のような実行の度に値が変わるようなresponseを含んだAPIのテストがしたいとする。こういう場合はそもそも固定値を返せるように依存するコンポーネントを注入できるような構成にしておくのが良い。 依存…

go-webtestというパッケージを作ってました

github.com go-webtestというパッケージを作ってました。 go-webtest? 大雑把に言うと以下のようなものの詰め合わせです 手軽にresponseを取り出せるようなclient web apiのテスト時に発生するフラストレーションを緩和するような機能 request/responseをtes…

goでrequired/unrequiredに対応しつつpointerを使わないunmarshalJSONのエラーメッセージについて

昔以下の様な記事を書いていた。 goでJSONのunmarshal時のrequiredなfieldの扱いについて リンク先の記事ではpointerを使わないstruct定義に対してUnmarshalJSONを自前で定義することでどうにかやろうという感じのものだった。ただしこのリンク先の記事の実…

goでfunctional optionsを使う場合には、こういう感じで書かれていると嬉しいという話。

今日は素朴な話。functional optionsの利用者がこういう感じでコードを書いてくれると嬉しいよという話。 functional options ? goでわりと有名なデザインパターン(?)。 初出はこの辺り。ただ最近利用されているのはここに書かれている内容を簡略化した亜…

sqlxの使いかたを把握するための情報のメモ

sqlxの資料のメモ github.com 色々探すのが面倒なのでここにメモしておく。 godoc https://godoc.org/github.com/jmoiron/sqlx guide http://jmoiron.github.io/sqlx/ 後者はcontextの対応が含まれていないコードなので少し古いかもしれない。 はじめの一歩 …

goでcontextual logging + structural loggingする小さなパッケージを作った

github.com なんで作ったの? ちょっとした作業をするのに欲しくなったから。特にcontextual loggingの部分が欲しい。 ぶっちゃけた話structural loggingはzapを使えばおしまいで良さそうだった。ただできそうなことが多すぎそうだったので絞った。 contextu…

go-run meets pstree

以下の内容のメモ 現在の環境1で実行されるprocessの概観を掴む方法 go runがtmp directoryにbuildした結果のバイナリをsubprocessとして実行していること go runが実行するprocess 例えば以下の様なテキトウなfile serverのようなコードがあるとする2。 mai…