Чтобы ожидать два потока событий одновременно в Go, вы должны использовать оператор select
, но он работает только на каналах.
Таким образом, каноническое решение состоит в том, что имеется процедура, которая читает из сокета (блокирует) и помещает данные в канал. Затем вы можете select
на этом канале вместе с другим каналом.
Псевдокод:
// Want to wait on channel 'chan' and socket connection 'conn'
// sockCh is used to notify of new data arrived on the socket
sockCh := make(chan []byte)
// This goroutine listens on the socket and pushes all data it gets
// into sockCh.
go func() {
for {
buf := make([]byte, 2048)
n, err := conn.Read(buf)
if err != nil && err != io.EOF {
log.Println("read error", err)
return
}
if n == 0 {
return
}
sockCh <- buf
}
}()
select {
case buf := <-sockCh:
// got buf from socket
case stuff := <-chan:
// got stuff from channel
}