os.IsTimeout în Go

Spune dacă o eroare înseamnă că a expirat timpul de așteptare (timeout) al unei operații.

Sintaxă
func IsTimeout(err error) bool

Ce face os.IsTimeout

os.IsTimeout returnează true când eroarea vine dintr-un termen-limită depășit: o citire dintr-un pipe sau o conexiune de rețea pentru care ai setat SetReadDeadline și datele nu au venit la timp.

Funcția verifică dacă eroarea are metoda Timeout() bool și dacă aceasta returnează true. Pentru erorile de termen-limită ale fișierelor există și errors.Is(err, os.ErrDeadlineExceeded).

Parametri

Parametru Descriere
err Eroarea de verificat.

Ce returnează

true pentru erori de tip timeout, altfel false.

Exemple

Exemplul 1: Citire cu termen-limită dintr-un pipe

Nimeni nu scrie în pipe, așa că citirea se oprește după 50 ms cu o eroare de timeout.

package main

import (
    "errors"
    "fmt"
    "os"
    "time"
)

func main() {
    r, w, err := os.Pipe()
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    defer w.Close()

    r.SetReadDeadline(time.Now().Add(50 * time.Millisecond))
    _, err = r.Read(make([]byte, 100))

    fmt.Println("eroare:", err)
    fmt.Println("IsTimeout:", os.IsTimeout(err))
    fmt.Println("ErrDeadlineExceeded:", errors.Is(err, os.ErrDeadlineExceeded))
}

Rezultat

eroare: read |0: i/o timeout
IsTimeout: true
ErrDeadlineExceeded: true

Exemplul 2: Alte erori nu sunt timeout

package main

import (
    "errors"
    "fmt"
    "os"
)

func main() {
    _, err := os.Open("lipsa.txt")
    fmt.Println(os.IsTimeout(err))
    fmt.Println(os.IsTimeout(errors.New("conexiune refuzată")))
    fmt.Println(os.IsTimeout(nil))
}

Rezultat

false
false
false

Greșeli frecvente

  • Aștepți un timeout pe un fișier obișnuit de pe disc. Fișierele normale nu acceptă termene-limită (SetReadDeadline dă eroare); funcționează pentru pipe-uri și conexiuni.

Comenzi înrudite

  • os.Pipe: Creează un pipe al sistemului de operare: ce scrii la un capăt (w) poți citi la celălalt (r).
  • os.IsNotExist: IsNotExist spune dacă o eroare înseamnă „fișierul nu există”; IsExist, dacă înseamnă „există deja”.
  • os.IsPermission: Spune dacă o eroare a apărut din lipsa drepturilor de acces (permission denied).