Пожалуйста, не будьте агрессивны с моим постом, я пытаюсь изучить Go, но сталкиваюсь с некоторыми трудностями в моем понимании.

Это мой пример кода:

package main

import (
        "log"
        "net/http"
        "reflect"
        "fmt"
)

func main() {
        mux := http.NewServeMux()

        rh := http.RedirectHandler("http://example.org", 307)
        fmt.Println("The type of the object, returned by the RedirectHandler is")
        fmt.Println(reflect.TypeOf(rh))
        fmt.Println("End with type observation")
        mux.Handle("/foo", rh)

        log.Println("Listening ...")
        http.ListenAndServe(":3000", mux)
}

Мои вопросы:

  1. RedirectHandler возвращает интерфейс обработчика, это общий шаблон и в чем его преимущество?
  2. Означает ли это, что внутри функции у вас должна быть структура, реализующая этот интерфейс, а затем возвращающая структуру? Если нет, то как вообще вернуть интерфейс, ведь по сути это просто набор нереализованных методов?
  3. Если вы запустите мой код, вы увидите, что тип переменной 'rh' - * http.redirectHandler. Для такого указателя я ничего не могу найти в http-пакете, поэтому мы начали с «возвращает интерфейс», чтобы закончить с «вот ваш указатель, которого нет в документе».
  4. Это просто мои сбивающие с толку мысли, я был бы признателен за комментарии, которые помогут мне разобраться в моем замешательстве.
-1
Recoba20 8 Сен 2020 в 11:39

1 ответ

Лучший ответ
  1. RedirectHandler возвращает интерфейс обработчика. Является ли это распространенным шаблоном и в чем заключается его преимущество?

Хотя существует практическое правило возврата конкретных типов вместо интерфейсов (часто обозначаемых как «Принять структуры возврата интерфейсов»), иногда по любому количеству причин желательно скрыть реализацию. Один из них - возможность произвольно изменять реализацию в будущих версиях пакета. Другой - предотвратить неправильное использование возвращаемого значения; например, одновременный доступ к полям структуры.

Если все эти функции (RedirectHandler, NotFoundHandler, TimeoutHandler и т. Д.) Возвращают http.Handler, они также легко обнаруживаются в документации: все они появляются вместе как конструкторы для http.Handler, а не разбросаны по списку функций. Я предполагаю (!), Что это могло сыграть роль при принятии решения сделать это таким образом, но вам придется спросить авторов (вы можете сделать это на список рассылки).

  1. Означает ли это, что [RedirectHandler возвращает] структуру, реализующую этот интерфейс?

Может быть. Он также может возвращать любой другой тип, реализующий интерфейс, хотя это действительно тип структуры в Go 1.15. Но это может измениться именно потому, что функция возвращает интерфейс вместо конкретного типа.

  1. Если вы запустите мой код, вы увидите, что тип переменной 'rh' - * http.redirectHandler. Для такого указателя я ничего не могу найти в пакете http.

Документы для неэкспортированных идентификаторов по умолчанию не отображаются (потому что вы все равно не можете их использовать). Добавьте m=all в строку запроса, чтобы показать их: https: / /golang.org/pkg/net/http/?m=all#redirectHandler

1
Peter 8 Сен 2020 в 09:39