Необходим ли цикл for для чтения данных из tcp-соединения в go? - PullRequest
0 голосов
/ 26 октября 2018

Есть функция для обработки 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, это правильный способ мышления?

1 Ответ

0 голосов
/ 26 октября 2018

Общий шаблон для обработки соединений с сервером может быть

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 может читать входные данные все в одном чанке, тогда цикл не нужен

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

...