@unique_nickname

Как правильно указать тип?

Есть следующая функция
func (c *Client) createTask(task *Task) (int, error) {
	path := &url.URL{Path: CreateTaskEndpoint}
	uri := c.BaseUrl.ResolveReference(path)
	reqBody := &CreateTaskRequest{
		ClientKey: c.ApiKey,
		Task:      task,
		SoftId:    c.SoftId,
	}
	reqJsonBody, err := json.Marshal(reqBody)
	if err != nil {
		return 0, err
	}

	res, err := c.Http.Post(uri.String(), "application-json", bytes.NewBuffer(reqJsonBody))
	if err != nil {
		return 0, err
	}

	if res.StatusCode != http.StatusOK {
		return 0, errors.New("unexpected status code" + strconv.Itoa(res.StatusCode))
	}

	var resJsonBody CreateTaskResponse
	resBody, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return 0, err
	}

	err = json.Unmarshal(resBody, &resJsonBody)
	if err != nil {
		return 0, err
	}

	if resJsonBody.Error != 0 {
		return 0, errors.New("api error: " + strconv.Itoa(resJsonBody.ErrorCode) + resJsonBody.ErrorDescription)
	}

	return resJsonBody.TaskId, nil
}


В принципе сам код не важен, вопрос не столько в нём сколько в аргументе task. В нём может быть 10 разных наборов полей, как правильнее поступить в таком случае?

У меня несколько вариантов:
1) И самый разумный на мой взгляд - создать структуры для каждого возможного типа task, а тип агрумента поменять на any
2) создать структуры для каждого возможного типа task и под каждый отдельную функцию createTask*TaskType*(). Но тут проблема в огромном количестве повторяющегося кода, решение кажется ужасным

Как вообще решаются подобного рода проблемы в go?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Вынеси всю одинаковость в новую функцию. Обработки ошибок и прочее. А кастомные вещи пускай будут в специальных функциях TaskLocal, TaskRemote. Там у тебя останется 5 строчек (я так думаю).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы