Sobes.tech
Junior — Middle

Jak zaimplementować sumę wariantów typów (type sum) w języku Go?

sobes.tech AI

Odpowiedź od AI

W Go nie ma bezpośredniego wsparcia dla typów sum (type sum), jak w niektórych językach funkcyjnych (Haskell, Scala). Jednak można osiągnąć podobny efekt za pomocą interfejsów i switcha typu.

Interfejs w Go opisuje zestaw metod, a każdy typ implementujący te metody spełnia interfejs. Aby zaimplementować typy sum, można zdefiniować interfejs bez metod (pusty interfejs interface{}) lub z metodami wspólnymi, a następnie użyć switcha typu do określenia konkretnego typu w czasie wykonywania.

Przykład:

package main

import "fmt"

type Shape interface{} // pusty interfejs, może być dowolnym typem

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
}

W ten sposób, interfejs i switch typu pozwalają na zaimplementowanie zachowania podobnego do sumy typów, gdzie zmienna może przyjmować wartości różnych typów, a w zależności od typu wykonywana jest odpowiednia logika.