如何以可讀方式打印地圖,結構體或其他內容?用golang打印可讀變量
使用PHP,你可以到這個
echo '<pre>';
print_r($var);
echo '</pre>';
或
header('content-type: text/plain');
print_r($var);
如何以可讀方式打印地圖,結構體或其他內容?用golang打印可讀變量
使用PHP,你可以到這個
echo '<pre>';
print_r($var);
echo '</pre>';
或
header('content-type: text/plain');
print_r($var);
您可以使用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
}
使用轉到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,但是更簡單的是 。
如果您的示例代碼也顯示了「%+ v」和「%v」,那會更好。 – AndrewN 2014-09-25 20:03:29
爲了調試我用這個:
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")
}
}
fmt.Printf("%v", whatever)
在圍棋是喜歡的print_r()的var_dump(),var_export()在PHP。 (該%v
是重要的組成部分。)
好運
我認爲在很多情況下,使用 「%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}}
}
https://github.com/davecgh/go-spew
Go-spew爲Go數據結構實現了一個深度漂亮的打印機,以幫助進行調試。
如果您正在生成HTML,請不要使用顯式的Fprintf()語句來執行此操作,除非您確實知道自己在做什麼。首選'html/template',它可以正確轉義。你上面寫的代碼容易受到微小的注入攻擊。不要這樣做。 :P – dyoo 2014-09-26 21:53:49