golang

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のコマンドライン…

goでそのパッケージが利用しているパッケージを調べるコマンドを作った(pkg-tree)

github.com 元々の発端はdepがTOMLの読み込みに使っているパッケージが何か調べるのが面倒だったため。 install $ go get -v github.com/podhmo/pkg-tree 使いかた。デフォルトでは標準ライブラリも全部出てしまうので邪魔だったら --ignore-std-pkg などの…

過去に作ったgoのコードを書き直して、hatenaのアップローダーにprofileオプションを追加したりした

過去に作ったgoのコードを書き直して、hatenaのアップローダーにprofileオプションを追加したりした。 過去に作ったgoのコードというのは以下の2つのこと。 https://github.com/podhmo/selfish https://github.com/podhmo/hatena selfishの方はgistへのアッ…

go言語のASTの全てのコメントは、*ast.File以下の子孫ノードから集める事はできないという話

*ast.File はファイル中のすべてのコメントを持っている goでASTを取り出すと、通常はファイル単位で扱うことになる。この時の値の型は *ast.File。ここで対応するファイル中のすべてのコメントは ast.File のCommentsフィールドにある。コメントは *ast.Com…

goのast.Fileからファイル名を取得する方法

*ast.File からファイル名を取得したい goのファイルのimportなどの情報を取得するのに、直接 go/* のpackageを使うよりも golang.org/x/tools/go/loader を使うのが手軽。 pkgname := "golang.org/x/tools/refactor/rename" c := loader.Config{} c.Import(…

goのコードの改行の情報はASTには含まれず、token.FileSetに格納されているという話

ASTを触る際にコメントの取扱いがだるいと一部で話題ですが。コメントの他にも取扱いが面倒なものがあります。それが改行の情報です。というよりもコードの字面上の情報を取り除いて取り扱いやすくした状態がASTなので装飾用の情報が入っていないというのは…

strangejsonで生成されるUnmarshalJSONのコードを短くした

github.com 生成されるUnmarshalJSONのコードを短くした。具体的にやったことはnewtype的に定義したstructのunmarsalをcastで済ませるようにした。 生成されるUnmarshalJSON 例えば以下のようなstruct定義で生成されるUnmarshalJSONは以下のようなもの。 // …

packageからfilepathを推測する方法あるいはその逆

packageからfilepathを推測する方法などをまとめておきたかった。 (ついでに個人的な信仰からホームディレクトリは~になっている) packageからfilepath package main import ( "go/build" "os" "os/user" "path/filepath" "strings" "github.com/pkg/errors"…

strangejson最近の進捗はJSONのunmarshal部分の生成ができるようになったこと

github.com まだ開発中で完成はしていないですが。strangejsonは最近の進捗によりJSONのunmarshal部分の生成ができるようになりました。 これはどういうことかと言うと以下のコードから。 github.com/podhmo/strangejson/examples/pointer02/person.go packa…

golangの現在のファイルのimport関係に即したTypeStringの表記を作る

TypeString? go/typesにQuqlifierという型がある。これと一緒にTypeStringという関数がある(いずれも、GOROOT/src/go/types/typestring.goに定義されている)。これらは型情報付きの表記をするために使われる。 type Qualifier func(*Package) string // Type…

遊びでstrangejsonというgoのstructの定義とswagger定義(のようなもの)を行ったり来たりするようなものを作り始めた

github.com strangejsonというgoのstructの定義とswagger定義(のようなもの)との間を行ったり来たりするようなものを作り始めた。まだ完成はしていない。 何をするもの? 何をするものかと言うと goのstructの定義を見てswagger形式のschema定義(まだ確定は…

goでstructの定義を見てあれこれするのに、ast.Fileを直接見るよりtypes.Packageを参照したほうが楽(かもしれない)

goでstructの定義を見てあれこれしたいことがある。特にコード生成などの文脈が多い。このような時に巷の記事や情報などではASTをがんばって解析するという方法が紹介されている事が多い。それよりもtypes.Package経由で*types.Objectを触ったほうが便利だよ…

goでJSONのunmarshal時のrequiredなfieldの扱いについて

TL;DR goであんまりfieldにpointerを使いたくない required,unrequiredを表現するときにはpointerを使わざる負えない? unmarshal時に自分でチェックすればやれないこともない はじめに goのJSONへの対応について悩まされる事が多い。色々試行錯誤を繰り返し…