any în Go

Alias pentru interface{}: un tip care poate ține orice valoare; folosit și drept constrângere în generics.

Sintaxă
type any = interface{}

var x any = 42
func afiseaza(v any) { ... }
func F[T any](v T) { ... }

Ce face any

any este alt nume (alias) pentru interfața goală interface{}, introdus în Go 1.18. Pentru că interfața goală nu cere nicio metodă, orice valoare o satisface: o variabilă any poate ține un număr, un text, un struct sau un slice. fmt.Println(a ...any) o folosește ca să primească orice.

Valoarea din any nu se poate folosi direct ca tipul ei concret: ai nevoie de type assertion (x.(int)) sau de type switch. Așa, verificarea tipului se mută de la compilare la rulare, deci folosește any doar când chiar nu știi tipul (JSON necunoscut, funcții generale de afișare).

În generics, [T any] înseamnă „orice tip”. Diferența față de un parametru any obișnuit: în funcția generică, T este un tip concret ales la apel, iar rezultatul păstrează tipul, fără conversii.

Exemple

Exemplul 1: Valori de orice tip

package main

import "fmt"

func main() {
    var x any
    fmt.Println(x == nil)
    x = 42
    fmt.Printf("%v %T\n", x, x)
    x = "Iași"
    fmt.Printf("%v %T\n", x, x)

    profil := map[string]any{"nume": "Ana", "varsta": 24, "activ": true}
    fmt.Println(profil)
    if v, ok := profil["varsta"].(int); ok {
        fmt.Println("peste un an:", v+1)
    }
}

Rezultat

true
42 int
Iași string
map[activ:true nume:Ana varsta:24]
peste un an: 25

Exemplul 2: JSON necunoscut decodat în any

Numerele din JSON devin float64, obiectele map[string]any, listele []any.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var date any
    _ = json.Unmarshal([]byte(`{"oras":"Cluj","temp":21.5,"zile":[1,2]}`), &date)
    m := date.(map[string]any)
    fmt.Printf("%T %T %T\n", m["oras"], m["temp"], m["zile"])
    fmt.Println(m["oras"], m["temp"].(float64)+1)
}

Rezultat

string float64 []interface {}
Cluj 22.5

Greșeli frecvente

  • Operații direct pe any: x + 1 dă invalid operation: x + 1 (mismatched types any and untyped int).
  • []string trimis unde se cere []any: nu se convertește automat; construiești un slice nou.
  • any peste tot în loc de tipuri concrete sau generics: pierzi verificările compilatorului.

Comenzi înrudite

  • interface și interfețe: Interfața descrie un set de metode; orice tip care le are o implementează automat, fără declarație explicită.
  • type assertion: Scoate valoarea concretă dintr-o interfață: x.(T) verifică dacă interfața ține tipul T și îl returnează.
  • type switch: Un switch care alege ramura după tipul concret ținut de o interfață, cu variabila deja convertită.
  • generics (parametri de tip): Funcții și tipuri care lucrează cu mai multe tipuri, scrise o singură dată cu parametri de tip [T constrângere].
  • comparable: Constrângere predefinită pentru generics: tipurile care se pot compara cu == și != (pot fi chei de map).