type în Go

Variabile, constante și tipuri Go 1.0 (alias: Go 1.9, alias generic: Go 1.24)

Definește un tip nou (pe baza altuia, struct, interfață, funcție) sau un alias pentru un tip existent.

Sintaxă
type Nume TipDeBaza          // tip nou
type Punct struct { X, Y int }
type Alias = AltTip           // alias: același tip
type Stiva[T any] []T         // tip generic

Ce face type

type Nume TipDeBaza creează un tip nou, distinct de tipul de bază: type Lei float64 se reprezintă ca un float64, dar nu se amestecă direct cu el (ai nevoie de conversie Lei(x)). Avantajul: tipului nou îi poți adăuga metode, iar compilatorul te oprește să aduni lei cu kilograme.

Cel mai des, type definește struct-uri (type Elev struct { ... }), interfețe (type Forma interface { ... }) sau tipuri de funcție (type Filtru func(int) bool). Cu parametri de tip (type Stiva[T any] []T) obții un tip generic.

type Alias = Tip (cu egal) nu creează un tip nou, ci doar un al doilea nume pentru același tip: byte este alias pentru uint8, iar any pentru interface{}. Aliasurile sunt utile când muți un tip dintr-un pachet în altul.

Exemple

Exemplul 1: Tip nou cu metodă

Lei are propria metodă String; conversia din float64 este explicită.

package main

import "fmt"

type Lei float64

func (l Lei) String() string {
    return fmt.Sprintf("%.2f lei", float64(l))
}

func main() {
    pret := Lei(49.9)
    total := pret * 3
    fmt.Println("total:", total)

    var x float64 = 10
    total += Lei(x) // fără Lei(...) nu compilează
    fmt.Println("cu taxă:", total)
}

Rezultat

total: 149.70 lei
cu taxă: 159.70 lei

Exemplul 2: Struct, tip de funcție și alias

Text este alias, deci se folosește exact ca string.

package main

import "fmt"

type Elev struct {
    Nume string
    Nota float64
}

type Filtru func(Elev) bool

type Text = string // alias

func selecteaza(elevi []Elev, f Filtru) []Text {
    var nume []Text
    for _, e := range elevi {
        if f(e) {
            nume = append(nume, e.Nume)
        }
    }
    return nume
}

func main() {
    clasa := []Elev{{"Ana", 9.5}, {"Mihai", 6}, {"Ioana", 8.25}}
    promovati := selecteaza(clasa, func(e Elev) bool { return e.Nota >= 7 })
    fmt.Println(promovati)
    var t Text = "merge ca un string"
    fmt.Printf("%T\n", t)
}

Rezultat

[Ana Ioana]
string

Greșeli frecvente

  • Confuzia între type A B (tip nou, fără metodele lui B) și type A = B (același tip).
  • Amestecarea unui tip nou cu tipul de bază fără conversie: mismatched types Lei and float64.
  • Adăugarea de metode unui tip din alt pachet (func (s string) ...): nu este permis; definește un tip propriu.

Comenzi înrudite

  • struct și struct-uri: Grupează mai multe câmpuri cu nume și tipuri diferite într-un singur tip; baza pentru modelarea datelor în Go.
  • metode: Funcții legate de un tip prin receptor; cu receptor pointer pot modifica valoarea pe care sunt apelate.
  • interface și interfețe: Interfața descrie un set de metode; orice tip care le are o implementează automat, fără declarație explicită.
  • 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].