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 luiB) șitype 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].