包含地图的对象?
Object containing a map?
我正在尝试获取我们所有端点的列表。
我们使用果阿。
我注意到我们将所有端点添加到服务 (goa.New("service_name")
)。我还意识到如果我打印 service.Mux 我可以看到所有端点。但是,端点看起来像是在一个映射中,而映射包含在一个对象中。打印 service.Mux 时,我也会看到内存地址。我如何只获得端点?
fmt.Println("Service Mux: ", service.Mux)
&{0xc42092c640 map[OPTIONS/api/my/endpoint/:endpointID/relationships/links:0x77d370 ...]}
Goa 库目前不支持此功能。 Mux 是一个可用选项很少的接口。不幸的是,在可用的选项中没有一个用于检索该地图:-(
您可以使用 reflect
和 unsafe
包获取底层和未导出的地图值,该值在此处定义 (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)
}
但请注意,使用这种方法,您的代码取决于实现细节,而不是 public API,因此您不能依赖它的稳定性。
我正在尝试获取我们所有端点的列表。
我们使用果阿。
我注意到我们将所有端点添加到服务 (goa.New("service_name")
)。我还意识到如果我打印 service.Mux 我可以看到所有端点。但是,端点看起来像是在一个映射中,而映射包含在一个对象中。打印 service.Mux 时,我也会看到内存地址。我如何只获得端点?
fmt.Println("Service Mux: ", service.Mux)
&{0xc42092c640 map[OPTIONS/api/my/endpoint/:endpointID/relationships/links:0x77d370 ...]}
Goa 库目前不支持此功能。 Mux 是一个可用选项很少的接口。不幸的是,在可用的选项中没有一个用于检索该地图:-(
您可以使用 reflect
和 unsafe
包获取底层和未导出的地图值,该值在此处定义 (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)
}
但请注意,使用这种方法,您的代码取决于实现细节,而不是 public API,因此您不能依赖它的稳定性。