Объект, содержащий карту?
Я пытаюсь получить список всех наших конечных точек.
Мы используем Гоа.
Я заметил, что мы добавляем все наши конечные точки к сервису (goa.New("service_name")
). Я также понял, что, если я печатаю сервис.Mux, я вижу все конечные точки. Однако конечные точки выглядят так, как будто они находятся на карте, которая содержится в объекте. При печати service.Mux я тоже вижу адреса памяти. Как мне получить только конечные точки в одиночку?
fmt.Println("Service Mux: ", service.Mux)
&{0xc42092c640 map[OPTIONS/api/my/endpoint/:endpointID/relationships/links:0x77d370 ...]}
2 ответа
Вы могли бы использовать 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)
}
Но учтите, что при таком подходе ваш код зависит от деталей реализации, а не от публичного API, и поэтому вы не можете полагаться на его стабильность.
Библиотека Гоа в настоящее время не поддерживает это. Mux - это интерфейс, в котором доступно очень мало опций. Среди доступных опций нет ни одного для извлечения этой карты, к сожалению:-(