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.