我有以下https://play.golang.org/p/utnlHJqlX1:
package main
import (
"fmt"
"net/url"
)
func main() {
u, err := url.Parse("http://www.something.com")
if err != nil {
fmt.Println(err)
}
fmt.Printf("%+v", u)
}
我期待“%+ v”打印结构和字段。而是打印:“http://www.something.com”
答案 0 :(得分:3)
这似乎是因为Parse
正在返回指向结构的指针。
试试这个(注意*
):
fmt.Printf("%+v\n", *u)
修改了游乐场:
https://play.golang.org/p/Grjrp2QriK
修改强>
要对此进行扩展,原因是fmt
在执行Stringer
时会以不同方式处理实现%+v
的结构。
这是相关代码:https://golang.org/src/fmt/print.go?s=4772:4849#L577
由于*URL
实施了Stringer:https://golang.org/pkg/net/url/#URL.String
这是正在使用的字符串。
通过取消引用指针,我们得到一个URL
,它没有实现接口(因为String
方法中的接收器是一个指针)。
答案 1 :(得分:0)
您始终可以使用%#v
格式动词来打印任何值的Go语法表示。例如:
fmt.Printf("%#v\n",u)
这对于调试来说非常方便。自动代码生成。由于输出是Go表示,因此可以将其粘贴到测试中或类似于变量。
这样您就不必担心覆盖fmt.Stringer
的类型