flag.StringVar în Go

Definesc opțiuni care scriu valoarea direct într-o variabilă existentă (text, întreg, boolean), fără pointer returnat.

Sintaxă
func StringVar(p *string, name string, value string, usage string)
func IntVar(p *int, name string, value int, usage string)
func BoolVar(p *bool, name string, value bool, usage string)

Ce face flag.StringVar

Variantele ...Var primesc adresa unei variabile pe care o ai deja, în loc să returneze un pointer nou. Astfel poți folosi variabile obișnuite (fără *) sau câmpuri dintr-o structură de configurare.

Un truc des folosit: două nume pentru aceeași opțiune (scurt și lung), legate la aceeași variabilă: flag.BoolVar(&v, "v", false, "...") și flag.BoolVar(&v, "verbose", false, "..."). Există variante Var pentru toate tipurile: Float64Var, DurationVar, Int64Var etc.

Parametri

Parametru Descriere
p Adresa variabilei care primește valoarea.
name, value, usage Ca la flag.String, flag.Int, flag.Bool.

Ce returnează

Nimic; valoarea ajunge în *p după Parse.

Exemple

Exemplul 1: Configurare într-o structură

package main

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

type Config struct {
    Gazda   string
    Port    int
    Debug   bool
}

func main() {
    os.Args = []string{"api", "-gazda=api.exemplu.ro", "-port", "443"}

    var cfg Config
    flag.StringVar(&cfg.Gazda, "gazda", "localhost", "numele serverului")
    flag.IntVar(&cfg.Port, "port", 8080, "portul")
    flag.BoolVar(&cfg.Debug, "debug", false, "mod de depanare")
    flag.Parse()

    fmt.Printf("%+v\n", cfg)
}

Rezultat

{Gazda:api.exemplu.ro Port:443 Debug:false}

Exemplul 2: Nume scurt și lung pentru aceeași opțiune

package main

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

func main() {
    os.Args = []string{"sync", "-verbose", "-n", "3"}

    var detaliat bool
    var incercari int
    flag.BoolVar(&detaliat, "v", false, "detalii (scurt)")
    flag.BoolVar(&detaliat, "verbose", false, "detalii")
    flag.IntVar(&incercari, "n", 1, "număr de încercări (scurt)")
    flag.IntVar(&incercari, "incercari", 1, "număr de încercări")
    flag.Parse()

    fmt.Println("detaliat:", detaliat, "| încercări:", incercari)
}

Rezultat

detaliat: true | încercări: 3

Greșeli frecvente

  • Dai variabila fără &: flag.StringVar(nume, ...) nu compilează. Funcția are nevoie de adresă.
  • Pui valori implicite diferite pentru numele scurt și cel lung. Ultima definiție scrie valoarea implicită în variabilă; păstrează-le identice.

Comenzi înrudite

  • flag.String: Definește o opțiune text (-nume=valoare) și returnează un pointer la valoarea ei.
  • flag.Int: Definește o opțiune număr întreg (-n=10) și returnează un pointer la valoarea ei.
  • flag.Bool: Definește o opțiune da/nu: simpla prezență (-v) o face true.
  • flag.Parse: Citește opțiunile din linia de comandă (os.Args) și completează variabilele definite cu flag.String, flag.Int etc.