liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
package printer_test
 
import (
   "bytes"
   "fmt"
   "go/ast"
   "go/parser"
   "go/printer"
   "go/token"
   "strings"
   "testing"
)
 
// Dummy test function so that godoc does not use the entire file as example.
func Test(*testing.T) {}
 
func parseFunc(filename, functionname string) (fun *ast.FuncDecl, fset *token.FileSet) {
   fset = token.NewFileSet()
   if file, err := parser.ParseFile(fset, filename, nil, 0); err == nil {
       for _, d := range file.Decls {
           if f, ok := d.(*ast.FuncDecl); ok && f.Name.Name == functionname {
               fun = f
               return
           }
       }
   }
   panic("function not found")
}
 
func ExampleFprint() {
   // Parse source file and extract the AST without comments for
   // this function, with position information referring to the
   // file set fset.
   funcAST, fset := parseFunc("example_test.go", "ExampleFprint")
 
   // Print the function body into buffer buf.
   // The file set is provided to the printer so that it knows
   // about the original source formatting and can add additional
   // line breaks where they were present in the source.
   var buf bytes.Buffer
   printer.Fprint(&buf, fset, funcAST.Body)
 
   // Remove braces {} enclosing the function body, unindent,
   // and trim leading and trailing white space.
   s := buf.String()
   s = s[1 : len(s)-1]
   s = strings.TrimSpace(strings.ReplaceAll(s, "\n\t", "\n"))
 
   // Print the cleaned-up body text to stdout.
   fmt.Println(s)
 
   // output:
   // funcAST, fset := parseFunc("example_test.go", "ExampleFprint")
   //
   // var buf bytes.Buffer
   // printer.Fprint(&buf, fset, funcAST.Body)
   //
   // s := buf.String()
   // s = s[1 : len(s)-1]
   // s = strings.TrimSpace(strings.ReplaceAll(s, "\n\t", "\n"))
   //
   // fmt.Println(s)
}