Canonical guidance

Use when

Avoid

Preferred pattern

func decodeCreateUser(r *http.Request) (CreateUserRequest, error) {
	defer r.Body.Close()

	var req CreateUserRequest
	dec := json.NewDecoder(io.LimitReader(r.Body, 1<<20))
	dec.DisallowUnknownFields()

	if err := dec.Decode(&req); err != nil {
		return CreateUserRequest{}, err
	}
	if err := dec.Decode(&struct{}{}); err != io.EOF {
		return CreateUserRequest{}, errors.New("body must contain a single JSON object")
	}

	return req, nil
}

Anti-pattern

Explanation: This anti-pattern is tempting for flexibility, but untyped maps move validation bugs and shape confusion deeper into the application.

Why

Related pages

Sources