Go

gotypeコマンドでgolangのastの結果を視覚化する #golangjp

More than 3 years have passed since last update.

GolangのASTを可視化するツールを作った でastのステキな可視化がされていて出番は少ないかもしれませんが、gotypeコマンドでもastの結果を可視化できます。


これは何?

Go言語のソースコードを解析する際の補助的なツールです。

astパッケージを使う際のデバッグなどに役に立つと思います。


インストール

導入は:

$ go get golang.org/x/tools/cmd/gotype

でok。


簡単な使い方:

例えば:

package main

import (
"fmt"
)

func main() {
fmt.Println("Hello, 世界")
}

を入れてみると以下のようになります:

$ gotype -ast main.go

0 *ast.File {
1 . Package: main.go:1:1
2 . Name: *ast.Ident {
3 . . NamePos: main.go:1:9
4 . . Name: "main"
5 . }
6 . Decls: []ast.Decl (len = 2) {
7 . . 0: *ast.GenDecl {
8 . . . TokPos: main.go:3:1
9 . . . Tok: import
10 . . . Lparen: main.go:3:8
11 . . . Specs: []ast.Spec (len = 1) {
12 . . . . 0: *ast.ImportSpec {
13 . . . . . Path: *ast.BasicLit {
14 . . . . . . ValuePos: main.go:4:2
15 . . . . . . Kind: STRING
16 . . . . . . Value: "\"fmt\""
17 . . . . . }
18 . . . . . EndPos: -
19 . . . . }
20 . . . }
21 . . . Rparen: main.go:5:1
22 . . }
23 . . 1: *ast.FuncDecl {
24 . . . Name: *ast.Ident {
25 . . . . NamePos: main.go:7:6
26 . . . . Name: "main"
27 . . . . Obj: *ast.Object {
28 . . . . . Kind: func
29 . . . . . Name: "main"
30 . . . . . Decl: *(obj @ 23)
31 . . . . }
32 . . . }
33 . . . Type: *ast.FuncType {
34 . . . . Func: main.go:7:1
35 . . . . Params: *ast.FieldList {
36 . . . . . Opening: main.go:7:10
37 . . . . . Closing: main.go:7:11
38 . . . . }
39 . . . }
40 . . . Body: *ast.BlockStmt {
41 . . . . Lbrace: main.go:7:13
42 . . . . List: []ast.Stmt (len = 1) {
43 . . . . . 0: *ast.ExprStmt {
44 . . . . . . X: *ast.CallExpr {
45 . . . . . . . Fun: *ast.SelectorExpr {
46 . . . . . . . . X: *ast.Ident {
47 . . . . . . . . . NamePos: main.go:8:2
48 . . . . . . . . . Name: "fmt"
49 . . . . . . . . }
50 . . . . . . . . Sel: *ast.Ident {
51 . . . . . . . . . NamePos: main.go:8:6
52 . . . . . . . . . Name: "Println"
53 . . . . . . . . }
54 . . . . . . . }
55 . . . . . . . Lparen: main.go:8:13
56 . . . . . . . Args: []ast.Expr (len = 1) {
57 . . . . . . . . 0: *ast.BasicLit {
58 . . . . . . . . . ValuePos: main.go:8:14
59 . . . . . . . . . Kind: STRING
60 . . . . . . . . . Value: "\"Hello, 世界\""
61 . . . . . . . . }
62 . . . . . . . }
63 . . . . . . . Ellipsis: -
64 . . . . . . . Rparen: main.go:8:29
65 . . . . . . }
66 . . . . . }
67 . . . . }
68 . . . . Rbrace: main.go:9:1
69 . . . }
70 . . }
71 . }
72 . Scope: *ast.Scope {
73 . . Objects: map[string]*ast.Object (len = 1) {
74 . . . "main": *(obj @ 27)
75 . . }
76 . }
77 . Imports: []*ast.ImportSpec (len = 1) {
78 . . 0: *(obj @ 12)
79 . }
80 . Unresolved: []*ast.Ident (len = 1) {
81 . . 0: *(obj @ 46)
82 . }
83 }

-commentを合わせて入れればコメント行も解析します。

godocはこちら gotype