golang

コード生成における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…

go用のテストライブラリを作りました(言いたいことは分かります)

github.com go用のテストライブラリを作りました(言いたいことは分かります)。 使いかたはこんな感じです。 noerror.Must(t, noerror.Equal(30).Actual(add(10,20))) noerror.Should(t, noerror.NotEqual(30).Actual(add(10,20))) 以下詳細。 motivation 元…

reflect経由でgoのmethodを呼んだり存在を確認したりする

encoding/jsonパッケージの範囲を越えてJSONと戯れようとする。動的な何かが必要になる。そしてけっこうすぐにreflectパッケージに触れることになる。触りたくないけれど触る必要がある汚泥のような存在。それがreflect。 重い腰をあげてreflectと少し仲良く…

.vueに似た記述からwasmを出力するgo製のツールのvuguについて

少し前に微妙にvuguがバズっていた。触らずに分かった気になったりするのも良くないと思い実際に触ってみた。そのときに感じたことや思ったことのつぶやきをまとめてみた。 (本当はまじめに文章を書こうかとおもったけれど気力が無くなったので呟いたものを…

N個のchannelがcloseされるまで読み込む方法について

N個のchannelがcloseされるまで読み込む方法についてのメモ。 1個のchannelがcloseされるまで読み込む まずはじめにN=1の場合について。これは単にforループで取り出せば良い。 package main import ( "fmt" "sync" "time" ) func main() { var wg sync.Wait…

net/httpのhandlerを書く時に気をつけたほうが良い順序について

たまに標準ライブラリのみを使ってnet/httpのhandlerを実装することがある。その時の種々の操作で呼び出す順序を気にする必要があるものがある。それのメモ。 先に結論を言ってしまうと以下の順序で記述しましょうという話。 http headerに情報を追加する ht…

goで現在のパッケージが依存するパッケージを調べたい

goで依存するパッケージを調べたい。意外とgo listコマンドが便利に使えた。 # そのパッケージ自体 $ go list -f "{{if not .Standard}}{{.ImportPath}}{{end}}" -deps # cwd以下の全てのパッケージでの依存 $ go list -f "{{if not .Standard}}{{.ImportPat…

go 1.11のmodules(vgo)が有効な環境で相対importが cannot find module for path でエラーになった話。

vgoが有効な環境の場合に相対importがエラーになる 時折、GOPATH外で作業したりするときなどに相対importが使いたくなる。例えば以下の様な構成でxxx packageの関数を利用したい。 . ├── main.go └── xxx └── hello.go 1 directory, 2 files xxx/hello.go pa…

goでchannelやgoroutineを試すサンプルコードを書く時に便利なログ出力にする方法

標準のlogパッケージの使いかたをちょっと変えるだけで便利な形式で出力できそうなのでメモ。 :warning:まずはじめに大前提として、これはgoの挙動を確認するためのサンプルコードを書いてみるときの話であって、実際にアプリケーションなりツールなりを作ろ…