Sobes.tech
Junior — Middle

Kako implementirati zbir varijanti tipova (type sum) u jeziku Go?

sobes.tech АИ

Одговор од АИ

U Go nema direktnu podršku za zbirove tipova (type sum), kao što je to u nekim funkcionalnim jezicima (Haskell, Scala). Međutim, sličan efekat se može postići pomoću interfejsa i switch-a po tipu.

Interfejs u Go opisuje skup metoda, i bilo koji tip koji implementira te metode zadovoljava interfejs. Za implementaciju zbirova tipova, može se definisati interfejs bez metoda (prazan interfejs interface{}) ili sa zajedničkim metodama, a zatim koristiti switch po tipu za određivanje konkretnog tipa u vreme izvršenja.

Primer:

package main

import "fmt"

type Shape interface{} // prazan interfejs, može biti bilo koji tip

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
}

Na ovaj način, interfejs i switch po tipu omogućavaju implementaciju ponašanja sličnog zbiru tipova, gde promenljiva može da prihvati vrednosti različitih tipova, i u zavisnosti od tipa se izvršava odgovarajuća logika.