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.