Sobes.tech
Junior — Middle

Ako implementovať súčet variantov typov (type sum) v jazyku Go?

sobes.tech AI

Odpoveď od AI

V jazyku Go nie je priama podpora pre súčtových typov (type sum), ako je to v niektorých funkcionálnych jazykoch (Haskell, Scala). Avšak, podobný efekt možno dosiahnuť pomocou rozhraní a switcha typu.

Rozhranie v Go opisuje množinu metód, a akýkoľvek typ, ktorý tieto metódy implementuje, spĺňa rozhranie. Pre implementáciu súčtových typov možno definovať rozhranie bez metód (prázdne rozhranie interface{}) alebo s spoločnými metódami, a následne použiť switch typu na určenie konkrétneho typu počas behu.

Príklad:

package main

import "fmt"

type Shape interface{} // prázdne rozhranie, môže byť akýkoľvek 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 spôsobom umožňuje rozhranie a switch typu implementovať správanie podobné súčtu typov, kde premenná môže nadobúdať hodnoty rôznych typov, a v závislosti od typu sa vykoná príslušná logika.