Come si può implementare la somma di varianti di tipi (type sum) nel linguaggio Go?
sobes.tech AI
Risposta dell'AI
In Go, non c'è un supporto diretto per i tipi somma (type sum), come in alcuni linguaggi funzionali (Haskell, Scala). Tuttavia, si può ottenere un effetto simile usando interfacce e switch di tipo.
Un'interfaccia in Go descrive un insieme di metodi, e qualsiasi tipo che implementa questi metodi soddisfa l'interfaccia. Per implementare tipi somma, si può definire un'interfaccia senza metodi (interfaccia vuota interface{}) o con metodi comuni, e poi usare uno switch di tipo per determinare il tipo in fase di esecuzione.
Esempio:
package main
import "fmt"
type Shape interface{} // interfaccia vuota, può essere qualsiasi tipo
func area(s Shape) float64 {
switch v := s.(type) {
case Circle:
return 3.14 * v.Radius * v.Radius
case Rectangle:
return v.Width * v.Height
default:
return 0
}
}
type Circle struct {
Radius float64
}
type Rectangle struct {
Width, Height float64
}
func main() {
c := Circle{Radius: 5}
r := Rectangle{Width: 3, Height: 4}
fmt.Println(area(c)) // 78.5
fmt.Println(area(r)) // 12
}
In questo modo, l'interfaccia e lo switch di tipo permettono di implementare un comportamento simile alla somma di tipi, dove la variabile può assumere valori di diversi tipi, e in base al tipo viene eseguita la logica corrispondente.