Golang

GoのASTからソースコードを生成する

Goの標準ライブラリを用いてAST(抽象構文木)からソースコードを生成する方法のメモです。

ASTの取得

文字列からGoのASTを取得する例

import (
  "fmt"
  "go/ast"
  "go/parser"
  "go/token"
)
src := `
package main

import "fmt"

func main() {
  fmt.Println("Hello, World!")
}
`
// ソースファイル群を表すデータの作成
// ソースファイルデータにはファイル名やファイル内の構文の位置などの情報を持つ
// たとえばパッケージ単位でコードの解析を行う場合は同一ディレクトリのソースファイルをまとめて扱う必要があるのでソースファイル群という単位でソース情報を持っているものと思われる
fset := token.NewFileSet()
// ソースコードを構文木に変換
// 第二引数にファイル名を渡すとファイルを、第三引数にソースコードの文字列を渡すと文字列を変換する
f, err := parser.ParseFile(fset, "", src, 0)
if err != nil {
  fmt.Println(err)
  os.Exit(1)
}

ast.Print(fset, f)

go/parserParseFileの戻り値がASTになっている。
go/astPrintを利用して読みやすいように表示させている。

[golang] 構造体(struct)のdeepcopy

golangで構造体のdeepcopyを行う方法のメモです。

ポインタをメンバに持った構造体のdeepcopyをgolangだとどんな感じでできるのか気になったので調べてみました。