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 + 1dăinvalid operation: x + 1 (mismatched types any and untyped int). []stringtrimis unde se cere[]any: nu se convertește automat; construiești un slice nou.anypeste 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).