包含地图的对象?

时间:2018-06-20 12:22:29

标签: rest go mux goa

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

我们使用果阿。

我注意到我们将所有端点都添加到服务(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 ...]}

2 个答案:

答案 0 :(得分:2)

您可以使用reflectunsafe包来获取基础和未导出的地图值,该值在此处(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,因此您不能依赖其稳定性。

答案 1 :(得分:0)

Goa库当前不支持此功能。 Mux是一个几乎没有可用选项的界面。在可用的选项中,不幸的是没有一个可以检索该地图的选项:-(