💬 Как обрабатывать ошибки сетевых соединений в Go?



В Go обработка ошибок сетевых соединений основана на принципе явной проверки возвращаемых ошибок. После каждого вызова сетевых функций (Dial, Listen, Accept и других) важно проверять возвращаемый объект ошибки. Если ошибка не равна nil, принимаем соотвествующие меры в зависимости от задач программы.



Для корректной обработки сценариев прерывания соединений и тайм-аутов в Go, можно использовать контекст и настроить тайм-ауты для сетевых операций:



☑️ Для установления соединения с тайм-аутом можно использовать DialContext из пакета net. Это позволяет указать контекст с тайм-аутом, автоматически прерывающим соединение по истечении указанного времени.



☑️ Можно также устанавливать тайм-ауты напрямую на сокете после его создания. Функции SetReadDeadline и SetWriteDeadline позволяют установить тайм-ауты для операций чтения и записи соответственно.



Простой пример, демонстрирующий использование контекста и тайм-аута:



package main



import (

"context"

"fmt"

"net"

"time"

)



func main() {

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

defer cancel()



conn, err := net.DialContext(ctx, "tcp", "google.com:80")

if err != nil {

fmt.Printf("Ошибка соединения: %s\n", err)

return

}

defer conn.Close()



// Устанавливаем тайм-ауты для операций чтения/записи

deadline := time.Now().Add(2 * time.Second)

conn.SetReadDeadline(deadline)

conn.SetWriteDeadline(deadline)



// Остальная часть кода для чтения/записи

}





Контекст с тайм-аутом в 5 секунд используется для установления соединения, а дедлайны для чтения и записи установлены в 2 секунды после установления соединения.