Sobes.tech
Junior — Middle

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.