首页 > 解决方案 > 包含地图的对象?

问题描述

我正在尝试获取我们所有端点的列表。

我们使用果阿。

我注意到我们将所有端点都添加到服务(goa.New("service_name"))中。我还意识到,如果我打印 service.Mux,我可以看到所有端点。但是,端点看起来像是在一个 Map 中,它包含在一个对象中。打印 service.Mux 时,我也看到了内存地址。我如何仅获得端点?

fmt.Println("Service Mux: ", service.Mux)

&{0xc42092c640 map[OPTIONS/api/my/endpoint/:endpointID/relationships/links:0x77d370 ...]}

标签: restgomuxgoa

解决方案


您可以使用reflectandunsafe包来获取底层和未导出的地图值,该值在此处定义(https://github.com/goadesign/goa/blob/master/mux.go#L48)。

像这样的东西:

rv := reflect.ValueOf(service.Mux).Elem()
rf := rv.FieldByName("handles")
rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem()

handles := rf.Interface().(map[string]goa.MuxHandler)
for k, h := range handles {
    fmt.Println(k, h)
}

但请注意,使用这种方法,您的代码依赖于实现细节而不是公共 API,因此您不能依赖它的稳定性。


推荐阅读