Sobes.tech
Middle+

Quali sono i modi per scrivere codice generico in Go?

sobes.tech AI

Risposta dell'AI

In Go, i principali metodi per scrivere codice generico sono i seguenti:

  • Interfacce: Permettono di scrivere funzioni che lavorano con qualsiasi tipo che soddisfi un insieme di metodi.

    // Definizione dell'interfaccia Reader
    type Reader interface {
        Read(p []byte) (n int, err error)
    }
    
    // Funzione che lavora con qualsiasi tipo che implementa Reader
    func ProcessData(r Reader) error {
        // lettura dei dati da Reader
        return nil
    }
    
  • Interfaccia vuota (interface{}): Tipo universale che può rappresentare qualsiasi valore. Richiede il cast di tipo prima dell'uso.

    func PrintAnything(v interface{}) {
        // Cast di tipo con verifica
        if s, ok := v.(string); ok {
            fmt.Println("Questa è una stringa:", s)
        } else if i, ok := v.(int); ok {
            fmt.Println("Questo è un numero intero:", i)
        }
    }
    
  • Generici (Generics) / Tipi parametrizzati (type parameters): Permettono di scrivere funzioni e tipi che lavorano con insiemi arbitrari di tipi specificati nella dichiarazione. Aggiunti in Go 1.18.

    // Funzione che lavora con slice di qualsiasi tipo T
    func PrintSlice[T any](s []T) {
        for _, v := range s {
            fmt.Println(v)
        }
    }
    
    // Tipo generico Pair con parametri T1 e T2
    type Pair[T1, T2 any] struct {
        First T1
        Second T2
    }
    
  • Riflessione (reflect): Permette di esplorare e interagire con tipi e valori durante l'esecuzione. Spesso usato per scenari complessi, ma può essere meno efficiente e sicuro rispetto ad altri approcci.

    import "reflect"
    
    func GetTypeName(v interface{}) string {
        return reflect.TypeOf(v).Name()
    }
    

La scelta del metodo dipende dal compito specifico e dal livello di flessibilità e prestazioni richiesto. I generici sono il metodo preferito per creare algoritmi e strutture dati generici nel Go moderno. Le interfacce rimangono un meccanismo chiave per il polimorfismo e la definizione del comportamento. L'interfaccia vuota e la riflessione sono usate meno frequentemente, per casi più specifici.