Ce face Type, Type1, TypeOrExpr, IntegerType, FloatType, ComplexType
Când citești documentația funcțiilor predefinite (go doc builtin), vezi tipuri precum Type, Type1 sau IntegerType. Ele nu există în limbaj: sunt nume de înlocuire, folosite doar ca să explice ce argumente acceptă funcțiile predefinite, care sunt mai flexibile decât orice funcție scrisă în Go.
Type înseamnă „orice tip Go, dar același în tot apelul” (la append, elementele au același tip ca slice-ul). Type1 este un al doilea tip, posibil diferit (tipul valorilor dintr-un map). TypeOrExpr înseamnă un tip sau o expresie (pentru new). IntegerType este orice tip întreg, FloatType este float32 sau float64, iar ComplexType este complex64 sau complex128.
Dacă scrii Type în cod, compilatorul răspunde undefined: Type. În funcțiile tale, echivalentul real sunt parametrii de tip din generics: func Ultimul[T any](s []T) T.
Exemple
Exemplul 1: Ce înseamnă în practică
len și make primesc „IntegerType”: orice tip întreg, nu doar int. real pe un complex64 dă un float32.
package main
import "fmt"
func main() {
var n uint8 = 3
s := make([]string, n) // IntegerType: merge și cu uint8
fmt.Println(len(s))
var c complex64 = 1 + 2i
r := real(c) // ComplexType complex64 -> FloatType float32
fmt.Printf("%v %T\n", r, r)
m := map[string]int{"a": 1} // Type = string, Type1 = int
delete(m, "a")
fmt.Println(m)
}
Rezultat
3
1 float32
map[]
Exemplul 2: Echivalentul în funcțiile proprii: generics
package main
import "fmt"
func Ultimul[T any](s []T) T {
return s[len(s)-1]
}
func Inverseaza[K comparable, V comparable](m map[K]V) map[V]K {
r := make(map[V]K, len(m))
for k, v := range m {
r[v] = k
}
return r
}
func main() {
fmt.Println(Ultimul([]string{"Iași", "Cluj"}), Ultimul([]int{1, 2, 3}))
fmt.Println(Inverseaza(map[string]int{"unu": 1, "doi": 2}))
}
Rezultat
Cluj 3
map[1:unu 2:doi]
Greșeli frecvente
- Folosirea lui
TypesauIntegerTypeîn cod:undefined: Type. - Concluzia că poți scrie funcții proprii la fel de flexibile ca
appendfără generics: funcțiile predefinite au reguli speciale în compilator.
Comenzi înrudite
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].append: Adaugă elemente la finalul unui slice și returnează slice-ul rezultat, mărind memoria când e nevoie.make: Creează și inițializează slice-uri, map-uri și canale, cu lungime, capacitate sau buffer dat.new: Alocă o variabilă nouă și returnează un pointer la ea; primește un tip (valoare zero) sau, din Go 1.26, o expresie.complex64, complex128, complex, real și imag: Numere complexe predefinite: complex128 (două float64), complex64 (două float32) și funcțiile complex, real, imag.