Type, Type1, TypeOrExpr, IntegerType, FloatType, ComplexType în Go

Nume folosite doar în documentația pachetului builtin, ca să descrie „orice tip”; nu se pot folosi în cod.

Sintaxă
// doar în documentația pachetului builtin:
func append(slice []Type, elems ...Type) []Type
func delete(m map[Type]Type1, key Type)
func new(TypeOrExpr) *Type
func make(t Type, size ...IntegerType) Type
func real(c ComplexType) FloatType

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 Type sau IntegerType în cod: undefined: Type.
  • Concluzia că poți scrie funcții proprii la fel de flexibile ca append fă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.