Documentation
¶
Overview ¶
Package goon is a deep pretty printer with Go-like notation. It implements the goon specification.
Deprecated: This package is old, incomplete, low code quality, and now unmaintained. See github.com/hexops/valast for a newer package that is the closest known direct replacement. See the Alternatives section in README.md for other known entries in this problem space.
Example ¶
type Inner struct {
Field1 string
Field2 int
}
type Lang struct {
Name string
Year int
URL string
Inner *Inner
}
x := Lang{
Name: "Go",
Year: 2009,
URL: "http",
Inner: &Inner{
Field1: "Secret!",
},
}
goon.Dump(x)
Output: (Lang)(Lang{ Name: (string)("Go"), Year: (int)(2009), URL: (string)("http"), Inner: (*Inner)(&Inner{ Field1: (string)("Secret!"), Field2: (int)(0), }), })
Example (Arrays) ¶
var x [0]int
var y = [...]int{1, 2, 3}
goon.Dump(x)
goon.Dump(y)
Output: ([0]int)([0]int{}) ([3]int)([3]int{ (int)(1), (int)(2), (int)(3), })
Example (Complete) ¶
goon.Dump([]int32{1, 5, 8})
{
x := (*string)(nil)
goon.Dump(x, nil)
}
goon.Dump([]byte("foodboohbingbongstrike123"))
goon.Dump(uintptr(0), uintptr(123))
{
f := func() { println("This is a func.") }
goon.Dump(f)
f2 := func(a int, b int) int {
c := a + b
return c
}
goon.Dump(f2)
unexportedFuncStruct := struct {
unexportedFunc func() string
}{func() string { return "This is the source of an unexported struct field." }}
goon.Dump(unexportedFuncStruct)
}
Output: ([]int32)([]int32{ (int32)(1), (int32)(5), (int32)(8), }) (*string)(nil) (interface{})(nil) ([]uint8)([]uint8{ (uint8)(102), (uint8)(111), (uint8)(111), (uint8)(100), (uint8)(98), (uint8)(111), (uint8)(111), (uint8)(104), (uint8)(98), (uint8)(105), (uint8)(110), (uint8)(103), (uint8)(98), (uint8)(111), (uint8)(110), (uint8)(103), (uint8)(115), (uint8)(116), (uint8)(114), (uint8)(105), (uint8)(107), (uint8)(101), (uint8)(49), (uint8)(50), (uint8)(51), }) (uintptr)(nil) (uintptr)(0x7b) (func())(func() { println("This is a func.") }) (func(int, int) int)(func(a int, b int) int { c := a + b return c }) (struct{ unexportedFunc func() string })(struct{ unexportedFunc func() string }{ unexportedFunc: (func() string)(func() string { return "This is the source of an unexported struct field." }), })
Example (DumpNamed) ¶
somethingImportant := 5 goon.DumpExpr(somethingImportant) fmt.Print(goon.SdumpExpr(somethingImportant)) goon.FdumpExpr(os.Stdout, somethingImportant)
Output: somethingImportant = (int)(5) somethingImportant = (int)(5) somethingImportant = (int)(5)
Example (Large) ¶
package main
import (
"go/ast"
"go/parser"
"go/token"
"runtime"
"github.com/shurcooL/go-goon"
)
func foo(bar int) int { return bar * 2 }
func main() {
fset := token.NewFileSet()
if file, err := parser.ParseFile(fset, thisGoSourceFile(), nil, 0); nil == err {
for _, d := range file.Decls {
if f, ok := d.(*ast.FuncDecl); ok {
goon.Dump(f)
break
}
}
}
}
// thisGoSourceFile returns the full path of the Go source file where this function was called from.
func thisGoSourceFile() string {
_, file, _, _ := runtime.Caller(1)
return file
}
Output: (*ast.FuncDecl)(&ast.FuncDecl{ Doc: (*ast.CommentGroup)(nil), Recv: (*ast.FieldList)(nil), Name: (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(115), Name: (string)("foo"), Obj: (*ast.Object)(&ast.Object{ Kind: (ast.ObjKind)(5), Name: (string)("foo"), Decl: (*ast.FuncDecl)(already_shown), Data: (interface{})(nil), Type: (interface{})(nil), }), }), Type: (*ast.FuncType)(&ast.FuncType{ Func: (token.Pos)(110), Params: (*ast.FieldList)(&ast.FieldList{ Opening: (token.Pos)(118), List: ([]*ast.Field)([]*ast.Field{ (*ast.Field)(&ast.Field{ Doc: (*ast.CommentGroup)(nil), Names: ([]*ast.Ident)([]*ast.Ident{ (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(119), Name: (string)("bar"), Obj: (*ast.Object)(&ast.Object{ Kind: (ast.ObjKind)(4), Name: (string)("bar"), Decl: (*ast.Field)(already_shown), Data: (interface{})(nil), Type: (interface{})(nil), }), }), }), Type: (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(123), Name: (string)("int"), Obj: (*ast.Object)(nil), }), Tag: (*ast.BasicLit)(nil), Comment: (*ast.CommentGroup)(nil), }), }), Closing: (token.Pos)(126), }), Results: (*ast.FieldList)(&ast.FieldList{ Opening: (token.Pos)(0), List: ([]*ast.Field)([]*ast.Field{ (*ast.Field)(&ast.Field{ Doc: (*ast.CommentGroup)(nil), Names: ([]*ast.Ident)(nil), Type: (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(128), Name: (string)("int"), Obj: (*ast.Object)(nil), }), Tag: (*ast.BasicLit)(nil), Comment: (*ast.CommentGroup)(nil), }), }), Closing: (token.Pos)(0), }), }), Body: (*ast.BlockStmt)(&ast.BlockStmt{ Lbrace: (token.Pos)(132), List: ([]ast.Stmt)([]ast.Stmt{ (*ast.ReturnStmt)(&ast.ReturnStmt{ Return: (token.Pos)(134), Results: ([]ast.Expr)([]ast.Expr{ (*ast.BinaryExpr)(&ast.BinaryExpr{ X: (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(141), Name: (string)("bar"), Obj: (*ast.Object)(&ast.Object{ Kind: (ast.ObjKind)(4), Name: (string)("bar"), Decl: (*ast.Field)(&ast.Field{ Doc: (*ast.CommentGroup)(nil), Names: ([]*ast.Ident)([]*ast.Ident{ (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(119), Name: (string)("bar"), Obj: (*ast.Object)(already_shown), }), }), Type: (*ast.Ident)(&ast.Ident{ NamePos: (token.Pos)(123), Name: (string)("int"), Obj: (*ast.Object)(nil), }), Tag: (*ast.BasicLit)(nil), Comment: (*ast.CommentGroup)(nil), }), Data: (interface{})(nil), Type: (interface{})(nil), }), }), OpPos: (token.Pos)(145), Op: (token.Token)(14), Y: (*ast.BasicLit)(&ast.BasicLit{ ValuePos: (token.Pos)(147), Kind: (token.Token)(5), Value: (string)("2"), }), }), }), }), }), Rbrace: (token.Pos)(149), }), })
Example (Map) ¶
goon.Dump(map[string]int64{
"x": 1,
"y": 4,
"z": 7,
})
Output: (map[string]int64)(map[string]int64{ (string)("x"): (int64)(1), (string)("y"): (int64)(4), (string)("z"): (int64)(7), })
Example (NilMap) ¶
var x map[string]int = nil
var y map[string]int = map[string]int{}
var z map[string]int = map[string]int{"one": 1}
goon.Dump(x)
goon.Dump(y)
goon.Dump(z)
Output: (map[string]int)(nil) (map[string]int)(map[string]int{}) (map[string]int)(map[string]int{ (string)("one"): (int)(1), })
Example (NilSlice) ¶
var x []int = nil
var y []int = []int{}
var z []int = []int{1}
goon.Dump(x)
goon.Dump(y)
goon.Dump(z)
Output: ([]int)(nil) ([]int)([]int{}) ([]int)([]int{ (int)(1), })
Example (Time) ¶
goon.Dump(time.Date(1, 2, 3, 4, 5, 6, 7, time.UTC))
goon.Dump(time.Date(1, 2, 3, 4, 5, 6, 7, time.Local))
goon.Dump(time.Time{})
Output: (time.Time)(time.Date(1, 2, 3, 4, 5, 6, 7, time.UTC)) (time.Time)(time.Date(1, 2, 3, 4, 5, 6, 7, time.Local)) (time.Time)(time.Time{})
Example (Unexported) ¶
type Lang struct {
Name string
year int
url string
}
x := Lang{
Name: "Go",
year: 2009,
url: "http",
}
goon.Dump(x)
Output: (Lang)(Lang{ Name: (string)("Go"), year: (int)(2009), url: (string)("http"), })
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DumpExpr ¶
DumpExpr dumps goon expressions to stdout.
E.g., this:
somethingImportant := 5 DumpExpr(somethingImportant)
Will print:
somethingImportant = (int)(5)
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.