Sobes.tech
Junior — Middle

Jak implementovat součet variant typů (type sum) v jazyce Go?

sobes.tech AI

Odpověď od AI

V jazyce Go není přímá podpora pro souhrn typů (type sum), jako například v některých funkcionálních jazycích (Haskell, Scala). Nicméně, podobný efekt lze dosáhnout pomocí rozhraní a switch příkazu typu.

Rozhraní v Go popisuje sadu metod, a jakýkoli typ, který tyto metody implementuje, splňuje rozhraní. Pro implementaci souhrnu typů lze definovat rozhraní bez metod (prázdné rozhraní interface{}) nebo s společnými metodami, a poté použít switch typu k určení konkrétního typu za běhu.

Příklad:

package main

import "fmt"

type Shape interface{} // prázdné rozhraní, může být jakýkoli typ

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
}

Tímto způsobem umožňuje rozhraní a switch typu implementovat chování podobné souhrnu typů, kde proměnná může nabývat hodnot různých typů, a podle typu se provádí odpovídající logika.