2014-09-25 81 views
7

如何以可读方式打印地图,结构体或其他内容?用golang打印可读变量

使用PHP,你可以到这个

echo '<pre>'; 
print_r($var); 
echo '</pre>'; 

header('content-type: text/plain'); 
print_r($var); 
+0

如果您正在生成HTML,请不要使用显式的Fprintf()语句来执行此操作,除非您确实知道自己在做什么。首选'html/template',它可以正确转义。你上面写的代码容易受到微小的注入攻击。不要这样做。 :P – dyoo 2014-09-26 21:53:49

回答

0

您可以使用fmt.Println()打印。您将需要导入“fmt”包(请参阅下面的示例)。许多数据类型可以打印出来。如果您想为自定义类型获得人眼可读的打印件,则需要为该类型定义一个String() string方法。

要尝试下面的例子,请点击这里:http://play.golang.org/p/M6_KnRJ3Da

package main 

import "fmt" 

// No `String()` method 
type UnstringablePerson struct { 
    Age int 
    Name string 
} 

// Has a `String()` method 
type StringablePerson struct { 
    Age int 
    Name string 
} 

// Let's define a String() method for StringablePerson, so any instances 
// of StringablePerson can be printed how we like 
func (p *StringablePerson) String() string { 
    return fmt.Sprintf("%s, age %d", p.Name, p.Age) 
} 

func main() { 
    // Bobby's type is UnstringablePerson; there is no String() method 
    // defined for this type, so his printout will not be very friendly 
    bobby := &UnstringablePerson{ 
     Age: 10, 
     Name: "Bobby", 
    } 

    // Ralph's type is StringablePerson; there *is* a String() method 
    // defined for this type, so his printout *will* be very friendly 
    ralph := &StringablePerson{ 
     Age: 12, 
     Name: "Ralph", 
    } 
    fmt.Println(bobby) // prints: &{10 Bobby} 
    fmt.Println(ralph) // prints: Ralph, age 12 
} 
6

使用转到fmt包。例如,

package main 

import "fmt" 

func main() { 
    variable := "var" 
    fmt.Println(variable) 
    fmt.Printf("%#v\n", variable) 
    header := map[string]string{"content-type": "text/plain"} 
    fmt.Println(header) 
    fmt.Printf("%#v\n", header) 
} 

输出:与功能

var 
"var" 
map[content-type:text/plain] 
map[string]string{"content-type":"text/plain"} 

​​

import "fmt" 

概述

fmt包器具格式化的I/O类似于至C的 的printf和scanf 。格式'动词'来源于C's,但是更简单的是 。

+4

如果您的示例代码也显示了“%+ v”和“%v”,那会更好。 – AndrewN 2014-09-25 20:03:29

0

为了调试我用这个:

func printVars(w io.Writer, writePre bool, vars ...interface{}) { 
    if writePre { 
     io.WriteString(w, "<pre>\n") 
    } 
    for i, v := range vars { 
     fmt.Fprintf(w, "» item %d type %T:\n", i, v) 
     j, err := json.MarshalIndent(v, "", " ") 
     switch { 
     case err != nil: 
      fmt.Fprintf(w, "error: %v", err) 
     case len(j) < 3: // {}, empty struct maybe or empty string, usually mean unexported struct fields 
      w.Write([]byte(html.EscapeString(fmt.Sprintf("%+v", v)))) 
     default: 
      w.Write(j) 
     } 
     w.Write([]byte("\n\n")) 
    } 
    if writePre { 
     io.WriteString(w, "</pre>\n") 
    } 
} 

playground

1
fmt.Printf("%v", whatever) 

在围棋是喜欢的print_r()的var_dump(),var_export()在PHP。 (该%v是重要的组成部分。)

好运

2

我认为在很多情况下,使用 “%V” 是不够简洁:

fmt.Printf("%v", myVar) 

从FMT包的文档页面:

%v默认格式的值。 打印结构的情况下,加上标志(%+ V)将字段名称

%·V

这里的围棋的语法表示是一个例子:

package main 

import "fmt" 

func main() { 
    // Define a struct, slice and map 
    type Employee struct { 
     id int 
     name string 
     age int 
    } 
    var eSlice []Employee 
    var eMap map[int]Employee 

    e1 := Employee{1, "Alex", 20} 
    e2 := Employee{2, "Jack", 30} 
    fmt.Printf("%v\n", e1) 
    // output: {1 Alex 20} 
    fmt.Printf("%+v\n", e1) 
    // output: {id:1 name:Alex age:20} 
    fmt.Printf("%#v\n", e1) 
    // output: main.Employee{id:1, name:"Alex", age:20} 

    eSlice = append(eSlice, e1, e2) 
    fmt.Printf("%v\n", eSlice) 
    // output: [{1 Alex 20} {2 Jack 30}] 
    fmt.Printf("%#v\n", eSlice) 
    // output: []main.Employee{main.Employee{id:1, name:"Alex", age:20}, main.Employee{id:2, name:"Jack", age:30}} 

    eMap = make(map[int]Employee) 
    eMap[1] = e1 
    eMap[2] = e2 
    fmt.Printf("%v\n", eMap) 
    // output: map[1:{1 Alex 20} 2:{2 Jack 30}] 
    fmt.Printf("%#v\n", eMap) 
    // output: map[int]main.Employee{1:main.Employee{id:1, name:"Alex", age:20}, 2:main.Employee{id:2, name:"Jack", age:30}} 
}