ab -v 4 http://localhost:3000/
, чтобы убедиться, что получаете верное содержимое ответа, чтобы быть на 100% уверенным, что отвечает именно сервер Go---
GET / HTTP/1.0
Host: localhost:11223
User-Agent: ApacheBench/2.3
Accept: */*
---
LOG: header received:
HTTP/1.0 200 OK
Date: Tue, 28 Dec 2021 14:29:27 GMT
Content-Length: 5
Content-Type: text/plain; charset=utf-8
Hello
LOG: Response code = 200
..done
type Error struct {
Code uint64 `json:"code"`
Message string `json:"message"`
}
// Error тип ошибки, который содержит сообщение и код ошибки
type Error struct {
Code uint64 `json:"code"`
Message string `json:"message"`
}
// Alias алиас для json маршалинга
type Alias Error
// New создаёт структуру Error
func New(code uint64, message string) *Error {
return &Error{
Code: code,
Message: message,
}
}
// Newf создаёт структуру Error, для формирования сообщения вызывает Sprintf
func Newf(code uint64, format string, args ...interface{}) *Error {
return &Error{
Code: code,
Message: fmt.Sprintf(format, args...),
}
}
// NewIfNotNil создаёт структуру Error если err != nil
func NewIfNotNil(code uint64, err error) *Error {
if err == nil {
return nil
}
return New(code, err.Error())
}
// Error реализация интерфейса error
func (e Error) Error() string {
return e.Message
}
// String реализация интерфейса Stringer
func (e Error) String() string {
return e.Message
}
// MarshalJSON реализует интерфейс json.Marshaler
func (e Error) MarshalJSON() ([]byte, error) {
return json.Marshal(Alias(e))
}
// UnmarshalJSON реализует интерфейс json.Unmarshaler
func (e *Error) UnmarshalJSON(data []byte) error {
if data == nil || string(data) == "null" {
return nil
}
err := (*Alias)(e)
return json.Unmarshal(data, &err)
}
func myFunc1() *errno.Error {
err := doSomthing(...)
if err != nil {
return errno.New(core.ErrCodeDBError, err.Error())
}
}
// или тоже самое, но в одну строку
func myFunc2() *errno.Error {
// если функция doSomthing вернёт nil - вернёт nil
// если doSomthing вернёт ошибку - создаст структуру с кодом ошибки core.ErrCodeDBError и сообщением
// и вернёт *errno.Error
return errno.NewIfNotNil(core.ErrCodeDBError, doSomthing(...))
}
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
wRecorder := httptest.NewRecorder()
next.ServeHTTP(wRecorder r)
resp := wRecorder.Result()
body, _ := io.ReadAll(resp.Body)
// не забыть записать ответ в w
}
return http.HandlerFunc(fn)
}