2015-01-05 4 views
0

Мое приложение выполняет множество вызовов API, и я пытаюсь избавиться от некоторого дублирования, окружающего это. Концептуально следующие шаги повторяются каждый раз, когда:Аннотация Получите, прочитайте, немаршалируйте логику

  1. Do запрашивайте ПОЛУЧИТЬ
    1. Проверка на наличие ошибок
  2. Прочитайте тело ответа
    1. Проверка на наличие ошибок
  3. Deserialize to target struct
    1. Проверка на наличие ошибок
  4. Верните целевой структура

Единственное существенное различие между всеми вызовами является целевой структурой. В коде это выглядит примерно так:

func getUsers() ([]User, error) { 
    resp, err := http.Get(someUrl) 
    if err != nil { 
     return nil, err 
    } 
    if resp.StatusCode != 200 { 
     return nil, errors.New("Search return non 200 status code") 
    } 

    defer resp.Body.Close() 

    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     return nil, err 
    } 

    var users []User // This is the only real difference! 
    err = json.Unmarshal(body, &users) 
    if err != nil { 
     return nil, err 
    } 

    return users, nil 
} 

Я хотел бы сделать что-то вроде getUsers(url, users) и getProjects(url, projects).

Я пытался с помощью функции, которая принимает interface{} и брось позже к нужному типу снова, но безрезультатно:

func request(url string, target interface{}) (interface{}, error) { 
    // do all the same logic as above. Except: 
    err = json.Unmarshal(body, &target) 
    // ... 
    return target, nil 
} 

, а затем сделать что-то вроде:

var users []User 
result, err := request(url, users) 
v, ok := result.([]User) 

У меня такое чувство, что это должно быть возможно ...

+0

Я рекомендовал бы поставить код, который вы в настоящее время дублируется в ППО. –

ответ

0

Не используйте адрес interface{}, он уже содержит указатель, необходимый для отмены маршалинга.

func request(url string, target interface{}) (interface{}, error) { 
    // get response 
    err = json.Unmarshal(body, target) 
    ... 

example

+0

Так близко, но до сих пор. Спасибо за последний толчок! Кстати, обратный интеллект {} даже не нужен. – harm

+0

Написал слишком быстро, я думаю, даже не использовал возврат, который мне не нужен;) – JimB