Sobes.tech
Middle+

Quali mezzi di programmazione generica esistono?

sobes.tech AI

Risposta dell'AI

In Golang esistono i seguenti strumenti di programmazione generica (generici):

  1. Tipi parametrizzati: Permettono di creare strutture, interfacce e funzioni che possono lavorare con diversi tipi di dati senza specificarli rigidamente in fase di compilazione. I tipi di dati sono indicati tra parentesi quadre dopo il nome del tipo o della funzione.

    // Esempio di struttura con tipo parametrizzato
    type Stack[T any] struct {
    	elements []T
    }
    
    // Esempio di funzione con tipi parametrizzati
    func Map[T, U any](collection []T, f func(T) U) []U {
    	result := make([]U, len(collection))
    	for i, item := range collection {
    		result[i] = f(item)
    	}
    	return result
    }
    
  2. Restrizioni di tipo (Type Constraints): Definiscono un insieme di tipi che possono essere usati come parametri generici. Permettono di limitare l'universalità dei tipi e garantire la sicurezza delle operazioni.

    • Interfacce: Qualsiasi interfaccia di per sé è una restrizione di tipo.
    • Interfacce combinate: Permettono di combinare più tipi o interfacce usando l'operatore |.
    // Esempio di restrizione di tipo usando un'interfaccia combinata
    type Number interface {
    	int | int8 | int16 | int32 | int64 |
    		uint | uint8 | uint16 | uint32 | uint64 | uintptr |
    		float32 | float64 |
    		complex64 | complex128
    }
    
    // Funzione che usa la restrizione di tipo
    func Add[T Number](a, b T) T {
    	return a + b
    }
    

Questi strumenti sono stati aggiunti in Go 1.18. Prima di allora, per implementare qualcosa di simile ai generici, si usavano interfacce (interface{}) e riflessione, il che riduceva la sicurezza dei tipi e le prestazioni.