В документации указано, что
Для запросов сервера Тело запроса всегда не равно нулю, но возвращает EOF немедленно, когда тело отсутствует.
Для ContentLength в документации указано
Для запросов клиентов значение 0 означает неизвестно, если Тело не равно нулю.
Так лучше проверить ContentLength
r *http.Request
if r.ContentLength == 0 {
//empty body
}
или проверить EOF
type Input struct {
Name *string `json:"name"`
}
input := new(Input)
if err := json.NewDecoder(r.Body).Decode(input); err.Error() == "EOF" {
//empty body
}