Nel linguaggio Go, lo sviluppatore può creare i propri tipi basati su tipi esistenti o dichiarare alias per la leggibilità del codice e l'integrazione con librerie esterne.
Storia della questione:
Go semplifica drasticamente il sistema dei tipi, separando i concetti di creazione di un nuovo tipo (type MyInt int) e di alias (type MyIntAlias = int). Spesso si verifica confusione tra i due, che influisce sulla compatibilità dei dati tra diverse parti del sistema.
Problema:
Se si sceglie in modo errato il modo di dichiarare un tipo, si possono ottenere errori inconsistenti: impossibilità di trasferire dati tra pacchetti, problemi nella gestione di librerie esterne o perdita di tutti i metodi durante il tentativo di utilizzare un alias.
Soluzione:
Esempio di codice:
package main import "fmt" type MyInt int // nuovo tipo func (m MyInt) Double() int { return int(m) * 2 } type MyIntAlias = int // alias di tipo func main() { var a MyInt = 5 var b MyIntAlias = 10 fmt.Println(a.Double()) // funziona //fmt.Println(b.Double()) // errore: metodo non definito su int }
Caratteristiche principali:
È possibile fare un alias per una struttura e aggiungere metodi che differiscono dalla struttura base?
No. I metodi possono essere dichiarati solo per un nuovo tipo, non per un alias. L'alias è semplicemente un altro nome per lo stesso tipo, e parte del programma non può sapere nulla riguardo a un "estensione" del tipo.
type MyStructAlias = SomeStruct // func (s MyStructAlias) NewMethod() {} // Errore
Possono i metodi del tipo base aderire automaticamente all'alias?
Sì, poiché si tratta dello stesso tipo per il compilatore. Ma non è possibile lavorare con i nuovi metodi: non puoi aggiungere metodi unici a un alias.
type MyString = string // tutti i metodi e le funzioni per string funzionano
Qual è la differenza tra castare a un tipo e a un alias?
Quando si dichiara un nuovo tipo è necessaria un'esplicita conversione: MyInt(x) dove x è int. Per un alias la conversione non è necessaria: i tipi sono completamente intercambiabili.
type A int type B = int var x int = 3 var a A = A(x) // conversione esplicita var b B = x // implicita, lo stesso di int
Uno sviluppatore crea un alias di tipo per una libreria esterna, credendo erroneamente che possa aggiungere sopra questo tipo i propri metodi e incapsulare la logica di transizione.
Vantaggi:
Svantaggi:
Il team crea un nuovo tipo basato su int per rappresentare gli identificatori utente, al fine di proteggere la logica di business da confusioni accidentali con altri valori interi e aggiunge metodi speciali (validatori, convertitori).
Vantaggi:
Svantaggi: