我有这个Router结构,该结构具有保存指向结构的指针的映射的属性:
type Router struct {
tree map[string]*node
}
创建路由器:
func New() *Router {
return &Router{
make(map[string]*node),
}
}
节点结构如下:
type node struct {
path string
method string
}
然后我像这样添加key:value对:
func (r *Router) GET(path string) {
r.tree["GET"] = createNode(path, "GET")
fmt.Println("GET:r:", r.tree)
}
func createNode(path string, method string) *node {
return &node{path, "GET"}
}
然后我尝试像这样使用此软件包:
var server = goserve.New()
func main() {
server.GET("/home")
fmt.Printf("%+v", server)
}
问题是,当我运行使用此软件包的模块时,我看到的是地址,而不是节点结构中的值,我认为指针应该显示出来。我很困惑,因为New函数返回一个* Router并按照我期望的方式显示,而createNode函数返回* node(也是一个指针)但没有正确显示...我是什么失踪了吗?
结果:
GET:r: map[GET:0xc00000e2e0]
&{tree:map[GET:0xc00000e2e0]}%
请注意,我使用的是两种不同的打印方法,但这两种都不起作用
答案 0 :(得分:0)
您需要为String()
定义一个Router
方法。这是为了实现Stringer接口。
例如:
func (r *Router) String() string {
buf := &bytes.Buffer{}
buf.WriteString("Router (\n")
for _, v := range r.tree {
fmt.Fprintf(buf, "\t%s: %s\n", v.method, v.path)
}
buf.WriteString(")")
return buf.String()
}
可运行的示例:https://play.golang.org/p/qgcUkxrAdyd
请注意,您的路由器存在问题,因为添加多个GET
会导致它们被覆盖。
答案 1 :(得分:0)
L Lawliet的答案是正确的,并提供了预期的结果。但是,查看byte
包文档会建议您使用strings
Builder
类型以提高效率。
代码如下:
func (r *Router) String() string {
b := &strings.Builder{}
b.WriteString("Router: {\n")
for _, v := range r.tree {
fmt.Fprintf(b, "\t%s: %s\n", v.method, v.path)
}
b.WriteString("}")
return b.String()
}
文档可以在这里找到: https://golang.org/pkg/strings/#Builder https://golang.org/pkg/bytes/#Buffer.String
如果我想念这个,请告诉我