# #go #model #mixins
Вопрос:
Для http-сервера я хочу скрыть работу с http.ResponseWriter
ним , удалив его из интерфейса как слишком сложный для простых задач. Таким образом, мои контроллеры будут принимать только запрос и возвращать ответ, который я хочу отправить:
func SampleController(r *http.Request) *Response { if something { return BadRequestResponse("something bad happened") } return MakeMyModelResponse("actual model response") } type Response interface { GetStatusCode() int GetContentType() string GetContent() []byte } func ResponseAdaptor(controller func (r *http.Request) Response) http.HandleFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { response := controller(r) headers := w.Header() headers.Set(HeaderContentType, response.ContentType()) w.WriteHeader(response.StatusCode()) _, _ = w.Write(response.GetContent()) }) }
затем я хочу создать реализацию по умолчанию, которая будет действовать как ответ объекта json
type JSONResponse struct{} func (c *JSONResponse) GetContentType() string { return AppJson } func (c *JSONResponse) GetStatusCode() string { return http.StatusOK } func (c *JSONResponse) GetContent() []byte { payload, _ := json.Marshal(/*problem is here, what to pass here?*/) return payload }
Я хочу иметь возможность просто встроить свой «микс» (я хочу, чтобы он вел себя так) в любую структуру ответа модели, чтобы он был упорядочен с помощью getContent, и мне не нужно вводить для него много кода:
type MyModelResponse struct { Result string `json:"result"` JSONResponse // i feel every1 will immediately understood what i want to achieve with it here. how to tell it compiler now? } func MakeMyModelResponse(result string) *MyModelResponse { return amp;MyModelResponse{ Result: result, } }
Есть какие-нибудь идеи? (хорошо, что не следует добавлять много строк кода в любую новую MyModelResponse
структуру для любой новой модели. В идеале должна быть 1 строка структуры кода, которая сообщит компилятору, что я хочу смешать поведение по умолчанию с типичным ответом json 200 ок)