2017この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。はじめにGoの標準パッケージには、goパッケージというものがあり、Goのソースコードを静的解析するのに便利な機能が提供されています。goパッケージを使うと、以下のようなツールが簡単に作れます。ソースコードを自動生成するツールソースコードに対してlintやフォーマットを行うツールリファクタリングツールソースコードから特定の何かを検索するツールミニ言語の処理系また、goパッケージを学ぶとコンパイラや言語処理系の知識も学べるので、他の標準パッケージとはまた少し違った知識を得ることができ、プログラミングの知識の幅が広がります。goパッケージに関する日本語の文献は少なく、学習しづらいのが辛いところです。私もこれまでgoパッケージについて、Qiita上でいくつか記事を書いてきましたが、どの記事が何をするときに役に立つのか分かりづらくなっていました。そこでこの記事では、どいういうときにどの記事を読めば良いのかをまとめてみました。公式ドキュメントなどまずは1次ソースとなる公式ドキュメントを挙げておきたいと思います。英語がスラスラと読める方には、公式ドキュメントを読むことをオススメします。多少英語が苦手でも、まずは公式ドキュメントを読むと良いと思いますが、英語だけで理解が難しい場合は、標準パッケージのソースコードも合わせても読むと理解が進むと思います。ソースコードは、GoDoc上かリンクを辿るか、GitHub上のsrc/go以下のコードを読むと良いでしょう。以下に静的解析を行うプログラムを作る際に読むと便利なドキュメントを挙げておきます。文法を把握しておくと理解が進むでしょうgoパッケージのドキュメントいくつかのサブパッケージがあります。詳しくは後述しますgo/typesのexampleを使って解説したドキュメントgo/typesパッケージについて詳しく書いたドキュメントで、go/tokenパッケージやgo/astパッケージを多少勉強してから読むと理解が進むでしょう定数についての公式ブログGoの定数については案外知られていないことが多いかもしれませんgo/typesパッケージやgo/constantパッケージについて勉強する際に参考になりますgoパッケージgoパッケージは、いくつかのサブパッケージから構成されています。それらのパッケージがざっくり何をやってるのかを説明します。解決などを行うgolang.org/x/tools/goパッケージ標準パッケージ以外にも、準標準パッケージのgolang.org/x/tools/goパッケージでも静的解析に関する機能が提供されています。結構な数のパッケージがありますが、特に以下の2つは便利だと思いますので、ここでは挙げておきます。golang.org/x/tools/go/ast/astutilパッケージASTに関する便利な処理を提供するパッケージastutil.PathEnclosingIntervalで指定したソースコード上の位置のノードを取得したりできますgolang.org/x/tools/go/types/typeutilパッケージgo/typesパッケージを補助する機能を提供するパッケージtypes.typeは単純にマップのキーにできないので、typeutil.Mapなどを使うgolang.org/x/tools/go/loaderパッケージパースから型チェックまでやってくれる機能を提供するパッケージソースコードを自動生成したいソースコードを自動生成するには、おそらくだいたい以下の手順で処理をするでしょう。元になるソースコードを読み込むソースコード上からコメントなどを取得し、そこに書いてある情報を取得ソースコードを生成する生成したソースコードをフォーマットを書ける1.〜2.に関しては、入力となる情報をソースコードから取得する話です。すると、ここはソースコードを解析せずに、引数としてパッケージ名や型名を直接もらってくるかもしれませんね。ソースコードを読み込むには、ソースコードをパースする必要があるので、以下の記事が参考になるでしょう。ASTを取得する方法を調べるまた、取得したASTを解析するのは、以下の記事が参考になります。抽象構文木(AST)をトラバースするコメントに書かれた文言を元に自動生成を行う場合は、以下の記事も参考になります。コメントに関連付けられたコードを取得するさて、ソースコードを生成するには、ASTを直接いじるか、text/templateパッケージなどを使って文字列としてソースコードを生成する方法があるでしょう。ASTをいじる方法としては、以下の記事が参考になるでしょう。testやGAE/Goで行っている方法ですが、GAE/Goに関しては以下の記事が参考になるでしょう。go-app-builderのソースコードを読む生成したソースコードをフォーマットする必要がありますが、上述の「抽象構文木(AST)をいじってフォーマットをかける」という記事に書いてあります。リファクタリングツールを作るgoパッケージを使うと、簡単にGoのソースコードを静的解析し、リファクタリングを行うツールを作ることができます。gorenameは識別子をリネームする際に使うツールですが、内部ではgoパッケージが使われています。gorenameはライブラリとしても使うことができ、リファクタリングツールを作る上で、gorenameの構成は非常に参考になります。以下の記事では、gorenameとその構成について書いています。gorenameをライブラリとして使うリファクタリングツールを作る際には、上述したASTを取得したり、トラバースしたりすることはもちろんですが、型情報に関する機能が必要になってきます。go/typesは型チェックを行うパッケージで、上述のgorenameでも使われています。go/typesパッケージについては、以下の記事で解説しています。Goのスコープについて考えてみようgo/typesパッケージを使い変数名をリネームしてみるスコープに関する記事は、案外知らなかったGoのスコープについても知ることができるかもしれません。golang.org/x/toolsパッケージ以下にも多くのリファクタリングツールが存在するので、参考にすると良いでしょう。処理系を作るgoパッケージを使うと、字句解析や構文解析の手間を省いて、GoのASTを流用したりすることで、Goと文法が近いミニ言語を簡単に作ることができます。式の評価を行うプログラムなど、案外作るのが面倒な処理もgo/astパッケージやgo/constantパッケージ、go/typesパッケージなどを使うと簡単に作ることができます。以下の記事を参考にして、自作の処理系などが作れるでしょう。簡単な式の評価機を作ってみる【実践goパッケージ】文字列から複素数型の値をパースするもっと楽して式の評価器を作るおわりにこの記事では、今まで書いたgoパッケージの記事について、何がどう役に立つのかまとめてみました。今まで「静的解析なんて難しそう」と思っていた方が、goパッケージを知ることで「よし、何か作ってみるか」という気持ちになってくれれば良いなと思います。CoderPortfolio.。