GoコンパイラのSSAバックエンドには、コンパイル段階のHTMLデバッグ出力を生成するツールがあります。この記事では、関数メソッドの SSA 出力を表示する方法について説明します。
関数、値メソッド、ポインタ・メソッドを含むサンプル・プログラムから始めましょう:
package main
import (
type Numbers struct {
vals []int
func (n *Numbers) Add(v int) {
n.vals = append(n.vals, v)
func (n Numbers) Average() float64 {
sum := 0.0
for _, num := range n.vals {
sum += float64(num)
return sum / float64(len(n.vals))
func main() {
var numbers Numbers
numbers.Add(200)
numbers.Add(43)
numbers.Add(-6)
fmt.Println(numbers.Average())
SSAデバッグ出力はGOSSAFUNC環境変数によって制御されます。この変数にはダンプする関数の名前が入ります。これは関数の完全修飾名です。上記のfunc mainの場合、関数名はmain main.mainです。
% env GOSSAFUNC=main go build
runtime
dumped SSA to ../../go/src/runtime/ssa.html
dumped SSA to ./ssa.html
この例では、GOSSAFUNC=mainはmain.mainとruntime.mainという関数の両方にマッチします。これは少し不運なことですが、おそらく実際には大したことではありません。なぜなら、もしコードにパフォーマンス上の微調整を加えるのであれば、func mainの巨大なスパゲッティ・ブロックの中ではないからです。
この記事を見て、メソッドをダンプできるSSA出力を探したかもしれません。
ポインタ・メソッド func (n *Numbers) Add の SSA デバッグを表示するには、同等の関数を (*Numbers).Add名前にします:
% env "GOSSAFUNC=(*Numbers).Add" go build
dumped SSA to ./ssa.html
値メソッド func (n *Numbers) Add の SSA デバッグを表示するには、同等の関数を (*Numbers).Add, という名前にします:
% env "GOSSAFUNC=(*Numbers).Average" go build
dumped SSA to ./ssa.html
- Goをソースからビルドしていない場合、ランタイムパッケージへのパスが読み取り専用になり、エラーメッセージが表示されることがあります。この問題を解決するためにsudoを使用しないでください。 
- シェルの基準注意 
を経由して





