Есть следующая функция
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?