golang
github.com はじめに goでhttptrace付きでgo runを実行するものを作っていた。詳しい話はアドベントカレンダーに記事を書いた。PoC的なものだったのでまじめには作っていなかったのだけれど意外と便利なので常用してみようとした。そのときに1つだけ困った…
通常go runは以下の様にして使う。 $ go run my/main.go my/xxx.go このときxxx.goはソースコードとして扱われてbuild時のpackageに含まれる。 ところで、go/astなどのコードを試しているときには、.goのファイルを入力として扱いたいときがある。このような…
過去の以下の記事の続き。 goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた この方法はたまに使われていたりする。ただリンク先の記事ではinterfaceを実装したstruct(アプリで実際に利用しているstruct)を埋め込んでいる。 これは…
何も考えずにgoimportsで補完された結果のコードを残しておいたら、pkg/errorsのerrorが独自定義のerrorに使われてしまって微妙だった。具体的に言うと意図しないスタックトレースを表示してしまうことになる。 例えば以下の様なコードのとき。 package main…
以前はgo-bindataを使っていたのだけれど。そういえば、作者がアカウント削除したあとに他の人がリポジトリ作成したみたいなことがあったな−。ということを思い出したりしたので代替品を探してみることにした。 statikを使う。statikはこちら。 https://gith…
最近色々コードを書いていた中で、goでは自分自身を返すメソッドは定義しないほうが良いのでは?という思いを抱くことがあった。自分自身を抱えすメソッドを定義するということを一般に悪いとする主義主張の人もいたりもするけれど。そこまで強硬に主張した…
github.com 作りました。 発端 gomvpkg-lightみたいなものを作りたい理由は2つあって。1つ目が遅い。2つ目が常にpackageの指定が再帰的に扱われるのがちょっと困るという感じ。— po (@podhmo) 2018年4月6日 まとめると もう少し速さが欲しい packageを再…
goはASTの解析が手軽なのが便利。ところでこれにgo/typesの機能を使うととても便利になる。その威力を一番わかりやすく体験できそうな例を思いついたので紹介する。 (実際にはgo/typesの機能の使いかたはこれいがいにも色々ある) go/types? go/typesとい…
go言語でローカルで定義した関数で再帰したいと思うことありますよね。ちょっと横着してクロージャに環境をキャプチャすることを任せてしまってそのコンテキストで木などを再帰的に辿りたいみたいな場合などに。 そんなわけでgoでもローカルで定義した関数上…
はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 機能をバラバラに使いたい 1,2ではあると便利なものをそのままあげたの…
はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 パッケージの情報の利用 goの標準ライブラリににgo/typesという素晴ら…
はじめに (個人的なコード生成のための環境を作っている。まだ完成には程遠いので実際のチュートリアルなどは作らない) コード生成用のツールに欲しいものを思いつくままにあげていく。 出力先の指定 コード生成で欲しいのは出力先を指定できることかもしれ…
(handwritingは自作のパッケージ。まだwip。todo どこかで説明) 昔にpythonで書いた貧者のfizzbuzzを作ってみる。 貧者のfizzbuzzとは(悪い意味で)まじめな人が書いたfizzbuzzのこと。(全ての条件分岐と出力処理を手書きする) code package main import ( …
はじめに structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話。これはもしかしたらニッチな話かもしれない。あるいはgoの本のどこにでも書いてある一般的な話かもしれない。今日goのコードを書いていてなるほどなーと…
突然ですがx/sync/errgroupはとても便利です。ちょっと並行で外部リソースにアクセスしたいときなどはsync/WaitGroupで書いてエラーの扱いを自分で頑張るよりerrgroupに任せた方が楽です。 g, ctx := errgroup.WithContext(ctx) // ここでのf0,f1,..などはgo…
github.com :warning: これは特にtwitterのmacアプリを代替するものではありません。 twitterのmacアプリが終了したので自分のタイムラインを雑に通知しまくるアプリを作った。というか、以前から自分自身のtimelineを何らかのnotificatorを使って通知すると…
go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法のメモ。 以下を知っておけば良い。 scope.Lookup(name)でtypes.Objectが取れる structと定義されているmethodの一覧の組はtypes.Namedというstructで管理されている types.Namedから全…
たまにどう書くか忘れて調べたりするので自分用の雛形をメモしておく。 kingpin だいたい自分でCLIのコマンドを作る場合には以下のようにしている。 使っているのはkingpin。とは言えこのパッケージにこだわりがあるというわけではなく。goのコマンドライン…
github.com 元々の発端はdepがTOMLの読み込みに使っているパッケージが何か調べるのが面倒だったため。 install $ go get -v github.com/podhmo/pkg-tree 使いかた。デフォルトでは標準ライブラリも全部出てしまうので邪魔だったら --ignore-std-pkg などの…
過去に作ったgoのコードを書き直して、hatenaのアップローダーにprofileオプションを追加したりした。 過去に作ったgoのコードというのは以下の2つのこと。 https://github.com/podhmo/selfish https://github.com/podhmo/hatena selfishの方はgistへのアッ…
*ast.File はファイル中のすべてのコメントを持っている goでASTを取り出すと、通常はファイル単位で扱うことになる。この時の値の型は *ast.File。ここで対応するファイル中のすべてのコメントは ast.File のCommentsフィールドにある。コメントは *ast.Com…
*ast.File からファイル名を取得したい goのファイルのimportなどの情報を取得するのに、直接 go/* のpackageを使うよりも golang.org/x/tools/go/loader を使うのが手軽。 pkgname := "golang.org/x/tools/refactor/rename" c := loader.Config{} c.Import(…
ASTを触る際にコメントの取扱いがだるいと一部で話題ですが。コメントの他にも取扱いが面倒なものがあります。それが改行の情報です。というよりもコードの字面上の情報を取り除いて取り扱いやすくした状態がASTなので装飾用の情報が入っていないというのは…
github.com 生成されるUnmarshalJSONのコードを短くした。具体的にやったことはnewtype的に定義したstructのunmarsalをcastで済ませるようにした。 生成されるUnmarshalJSON 例えば以下のようなstruct定義で生成されるUnmarshalJSONは以下のようなもの。 // …
packageからfilepathを推測する方法などをまとめておきたかった。 (ついでに個人的な信仰からホームディレクトリは~になっている) packageからfilepath package main import ( "go/build" "os" "os/user" "path/filepath" "strings" "github.com/pkg/errors"…
github.com まだ開発中で完成はしていないですが。strangejsonは最近の進捗によりJSONのunmarshal部分の生成ができるようになりました。 これはどういうことかと言うと以下のコードから。 github.com/podhmo/strangejson/examples/pointer02/person.go packa…
TypeString? go/typesにQuqlifierという型がある。これと一緒にTypeStringという関数がある(いずれも、GOROOT/src/go/types/typestring.goに定義されている)。これらは型情報付きの表記をするために使われる。 type Qualifier func(*Package) string // Type…
github.com strangejsonというgoのstructの定義とswagger定義(のようなもの)との間を行ったり来たりするようなものを作り始めた。まだ完成はしていない。 何をするもの? 何をするものかと言うと goのstructの定義を見てswagger形式のschema定義(まだ確定は…
goでstructの定義を見てあれこれしたいことがある。特にコード生成などの文脈が多い。このような時に巷の記事や情報などではASTをがんばって解析するという方法が紹介されている事が多い。それよりもtypes.Package経由で*types.Objectを触ったほうが便利だよ…
TL;DR goであんまりfieldにpointerを使いたくない required,unrequiredを表現するときにはpointerを使わざる負えない? unmarshal時に自分でチェックすればやれないこともない はじめに goのJSONへの対応について悩まされる事が多い。色々試行錯誤を繰り返し…