func ToString(expr ast.Expr) (string, error) {
	var buf bytes.Buffer
	err := format.Node(&buf, token.NewFileSet(), expr)
	return buf.String(), err
}
ToString converts the expression to a Go source string.
package gen  
import (
	"bufio"
	"bytes"
	"errors"
	"fmt"
	"go/ast"
	"go/format"
	"go/parser"
	"go/printer"
	"go/token"
	"io"
	"os"
	"path/filepath"
	"reflect"
	"strconv"
	"strings"
	"text/template"
	"golang.org/x/tools/imports"
)
var genFuncMap = template.FuncMap{
	"title":    strings.Title,
	"split":    strings.Split,
	"join":     strings.Join,
	"sanitize": Sanitize,
}
func TypeDecl(name *ast.Ident, typ ast.Expr) *ast.GenDecl {
	return &ast.GenDecl{
		Tok: token.TYPE,
		Specs: []ast.Spec{
			&ast.TypeSpec{
				Name: name,
				Type: typ,
			},
		},
	}
}
func Sanitize(name string) string {
	switch name {
	case "break", "default", "func", "interface", "select",
		"case", "defer", "go", "map", "struct",
		"chan", "else", "goto", "package", "switch",
		"const", "fallthrough", "if", "range", "type",
		"continue", "for", "import", "return", "var":
		return name + "_"
	}
	return name
}