golang

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

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は以下のようなもの。 // …