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ă (
SetReadDeadlinedă 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).