golang

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の挙動を確認するためのサンプルコードを書いてみるときの話であって、実際にアプリケーションなりツールなりを作ろ…

goでファイルを一時的に書き換えた処理をSIGINT時にもrollbackしたい場合のメモ

github.com はじめに goでhttptrace付きでgo runを実行するものを作っていた。詳しい話はアドベントカレンダーに記事を書いた。PoC的なものだったのでまじめには作っていなかったのだけれど意外と便利なので常用してみようとした。そのときに1つだけ困った…

go runに引数として.goのファイルを渡す方法について

通常go runは以下の様にして使う。 $ go run my/main.go my/xxx.go このときxxx.goはソースコードとして扱われてbuild時のpackageに含まれる。 ところで、go/astなどのコードを試しているときには、.goのファイルを入力として扱いたいときがある。このような…

テスト時のinterfaceに対するfake objectの作成にinterfaceの埋め込みを使う

過去の以下の記事の続き。 goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた この方法はたまに使われていたりする。ただリンク先の記事ではinterfaceを実装したstruct(アプリで実際に利用しているstruct)を埋め込んでいる。 これは…

pkg/errorsのerrorを独自定義のerrorに使ってしまうと微妙という話

何も考えずにgoimportsで補完された結果のコードを残しておいたら、pkg/errorsのerrorが独自定義のerrorに使われてしまって微妙だった。具体的に言うと意図しないスタックトレースを表示してしまうことになる。 例えば以下の様なコードのとき。 package main…

go-bindataの代わりにstatikを使うことにした

以前はgo-bindataを使っていたのだけれど。そういえば、作者がアカウント削除したあとに他の人がリポジトリ作成したみたいなことがあったな−。ということを思い出したりしたので代替品を探してみることにした。 statikを使う。statikはこちら。 https://gith…

goでは自分自身を返すメソッドは定義しないほうが良いのでは?という話。

最近色々コードを書いていた中で、goでは自分自身を返すメソッドは定義しないほうが良いのでは?という思いを抱くことがあった。自分自身を抱えすメソッドを定義するということを一般に悪いとする主義主張の人もいたりもするけれど。そこまで強硬に主張した…

gomvpkg-lightというパッケージを作った

github.com 作りました。 発端 gomvpkg-lightみたいなものを作りたい理由は2つあって。1つ目が遅い。2つ目が常にpackageの指定が再帰的に扱われるのがちょっと困るという感じ。— po (@podhmo) 2018年4月6日 まとめると もう少し速さが欲しい packageを再…

go言語でASTの解析にgo/typesの機能を使うことの威力について

goでASTの解析が手軽なのは便利。ところでこれにgo/typesの機能を使うととても便利になる。その威力を一番わかりやすく体験できそうな例を思いついたので紹介する。 (実際にはgo/typesの機能の使いかたはこれいがいにも色々ある) go/types? go/typesとい…

go言語でローカルで定義した関数で再帰する話

go言語でローカルで定義した関数で再帰したいと思うことありますよね。ちょっと横着してクロージャに環境をキャプチャすることを任せてしまってそのコンテキストで木などを再帰的に辿りたいみたいな場合などに。 そんなわけでgoでもローカルで定義した関数上…

コード生成用のツールに欲しいもの3 機能をバラバラに使いたい

はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 機能をバラバラに使いたい 1,2ではあると便利なものをそのままあげたの…

コード生成用のツールに欲しいもの2 パッケージの情報の利用

はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 パッケージの情報の利用 goの標準ライブラリににgo/typesという素晴ら…

コード生成用のツールに欲しいもの1 出力先の指定

はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 出力先の指定 コード生成で欲しいのは出力先を指定できることかもしれ…

handwritingでfizzbuzz

(handwritingは自作のパッケージ。まだwip。todo どこかで説明) 昔にpythonで書いた貧者のfizzbuzzを作ってみる。 貧者のfizzbuzzとは(悪い意味で)まじめな人が書いたfizzbuzzのこと。(全ての条件分岐と出力処理を手書きする) code package main import ( …

structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話

はじめに structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話。これはもしかしたらニッチな話かもしれない。あるいはgoの本のどこにでも書いてある一般的な話かもしれない。今日goのコードを書いていてなるほどなーと…

x/sync/errgroupの亜種みたいなものを考えたりしていた

突然ですがx/sync/errgroupはとても便利です。ちょっと並行で外部リソースにアクセスしたいときなどはsync/WaitGroupで書いてエラーの扱いを自分で頑張るよりerrgroupに任せた方が楽です。 g, ctx := errgroup.WithContext(ctx) // ここでのf0,f1,..などはgo…

twitterのmacアプリが終了したので自分のタイムラインを雑に通知しまくるアプリを作った

github.com :warning: これは特にtwitterのmacアプリを代替するものではありません。 twitterのmacアプリが終了したので自分のタイムラインを雑に通知しまくるアプリを作った。というか、以前から自分自身のtimelineを何らかのnotificatorを使って通知すると…

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法のメモ。 以下を知っておけば良い。 scope.Lookup(name)でtypes.Objectが取れる structと定義されているmethodの一覧の組はtypes.Namedというstructで管理されている types.Namedから全…

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

たまにどう書くか忘れて調べたりするので自分用の雛形をメモしておく。 kingpin だいたい自分でCLIのコマンドを作る場合には以下のようにしている。 使っているのはkingpin。とは言えこのパッケージにこだわりがあるというわけではなく。goのコマンドライン…