@Muxauko

Какой тип канала ставить?

Стоит задача сделать пост запрос на сервер, декодировать ответ и отправить в канал. С другой стороны горутина вытаскивает из канала и обрабатывает.
Вообщем тип канала поставил, но мне надо не полностью events передавать, элемент списка из него. Проблема в том, что не знаю как это делать. Ругается и все, если передаю events.Events[0] что не того типа, который нужен каналу.
Вот код https://play.golang.org/p/SPp8wP1ZkEL

вот скрин того, что сервер может прислать несколько обновлений, поэтому надо вытаскивать из списка
5ebab2825c86b295222947.png

требуется отправить в канал не events а events.Events[0]

а вот скрин одного из элемента того списка...вот в таком мне и надо передавать в канал, а не полность,как выше...
5ebab2bf17fb9198465668.png
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Должно быть немного иначе, первое что нужно изменить - это объявление самой структуры, оно должно быть таким
type Event struct {
        EventID int    `json:"eventId"`
        Type    string `json:"type"`
        ....
}


Судя по комментарию "//Делаем longpoll запрос на обновления" - логика должна быть немного иной, вы должны сделать один запрос и потом постоянно декодировать (по одному) пришедшие порции данных.
Если я понял верно - тогда делать нужно вот так
// канал создаёте вот так, т.к. вы хотите по одному событию передавать данные, а не целыми слайсами сразу
EventsCh = make(chan Event, 100)
go mailing(EventsCh)

// делаете HTTP запрос
response, responseErr := http.PostForm(...)

// создаёте decoder
decoder := json.NewDecoder(response.Body)

for {
    event := Event{}
    decoderErr := decoder.Decode(&event) // если данных нет - тут выполнение программы блокируется
    if decodeErr != nil { // тут может быть ошибка io.EOF (просто данные закончились, сервер корректно закрыл соединение)
       break
    }
    EventsCh <- event  // отправляете данные в канал, из которого их читает горутина
}


Функция mailing должна быть такой
func mailing(eventsCh chan Event){									//Получает события из канала
    for{
        event, ok := <- eventsChan
        if !ok {
            // канал закрыт
            break
        }
        log.Print("Получено ", event)
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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