Объект, содержащий карту?

Я пытаюсь получить список всех наших конечных точек.

Мы используем Гоа.

Я заметил, что мы добавляем все наши конечные точки к сервису (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 - это интерфейс, в котором доступно очень мало опций. Среди доступных опций нет ни одного для извлечения этой карты, к сожалению:-(

Другие вопросы по тегам