2014-09-25 38 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}} 
}