flag.Duration în Go

Definește o opțiune de durată (-timeout=30s, -interval=1m30s) și returnează un pointer la time.Duration.

Sintaxă
func Duration(name string, value time.Duration, usage string) *time.Duration

Ce face flag.Duration

flag.Duration citește valoarea cu time.ParseDuration, deci acceptă unități: ns, us, ms, s, m, h, și combinații ca 1h30m. Un număr fără unitate (în afară de 0) este refuzat.

Este mult mai clar decât o opțiune Int cu „secunde”: utilizatorul scrie exact ce vrea, iar în program primești un time.Duration gata de folosit.

Parametri

Parametru Descriere
name Numele opțiunii.
value Valoarea implicită, de exemplu 30*time.Second.
usage Descrierea pentru ajutor.

Ce returnează

Un *time.Duration.

Exemple

Exemplul 1: Timeout și interval

package main

import (
    "flag"
    "fmt"
    "os"
    "time"
)

func main() {
    os.Args = []string{"monitor", "-interval=1m30s", "-timeout", "500ms"}

    interval := flag.Duration("interval", time.Minute, "cât de des verificăm")
    timeout := flag.Duration("timeout", 5*time.Second, "cât așteptăm un răspuns")
    pauza := flag.Duration("pauza", 2*time.Hour, "pauza de noapte")
    flag.Parse()

    fmt.Println("interval:", *interval, "=", interval.Seconds(), "secunde")
    fmt.Println("timeout:", *timeout)
    fmt.Println("pauză:", *pauza)
}

Rezultat

interval: 1m30s = 90 secunde
timeout: 500ms
pauză: 2h0m0s

Exemplul 2: Număr fără unitate

Setul de opțiuni afișează eroarea și ajutorul, apoi Parse returnează eroarea.

package main

import (
    "flag"
    "fmt"
    "os"
    "time"
)

func main() {
    fs := flag.NewFlagSet("monitor", flag.ContinueOnError)
    fs.SetOutput(os.Stdout)
    fs.Duration("timeout", 5*time.Second, "cât așteptăm un răspuns")
    fmt.Println(fs.Parse([]string{"-timeout=30"}))
}

Rezultat

invalid value "30" for flag -timeout: parse error
Usage of monitor:
  -timeout duration
    	cât așteptăm un răspuns (default 5s)
invalid value "30" for flag -timeout: parse error

Greșeli frecvente

  • Scrii -timeout=30 și te aștepți la 30 de secunde. Unitatea este obligatorie: 30s.
  • Folosești d pentru zile. time.ParseDuration nu are zile; scrie 48h.

Comenzi înrudite

  • flag.Int: Definește o opțiune număr întreg (-n=10) și returnează un pointer la valoarea ei.
  • flag.Float64: Definește o opțiune număr cu zecimale (-tva=0.19) și returnează un pointer la valoarea ei.
  • flag.Parse: Citește opțiunile din linia de comandă (os.Args) și completează variabilele definite cu flag.String, flag.Int etc.
  • exec.CommandContext: Ca exec.Command, dar procesul este oprit automat când contextul expiră sau este anulat.