Нужен ли цикл for для чтения данных из tcp-соединения на ходу?

Есть функция для обработки TCP-соединения:

for {
    select {
    case conn := <-listen:
        go handleClient(conn)
    ...
}

func handleClient(client net.Conn) {
    for {
       // ...read from conn
       // at some point return
       return
    }
}

Мой вопрос: если вы используете цикл for, вы должны написать return, иначе это будет мертвый цикл. Если он вернется, эта функция handleClient будет выполняться только один раз. Значит, for здесь не нужен, верно? Мы все еще можем читать все данные Без for, правильно ли это думать?

2
0
232
1

Ответы 1

Обычным шаблоном для сервера, обрабатывающего соединения, может быть:

func handleClient(conn net.Conn) {
    r := bufio.NewReader(conn)
    for {
        line, err := r.ReadBytes(byte('\n'))
        switch err {
        case nil:
            break
        case io.EOF:
        default:
            fmt.Println("ERROR", err)
        }
        // do something with the data, in this case echo it back
        conn.Write(line)
    }
}

Цикл for {} необходим для чтения нескольких строк данных из соединения.

Если handleClient может читать ввод в одном фрагменте, цикл не нужен

Итак, да, вы правы, for {} не всегда необходимо, но это зависит от того, какие данные читаются. Часто такой цикл - лучший способ прочитать данные.

нужно вернуть в состоянии default:

GZ Xue 28.10.2018 08:15

Другие вопросы по теме