Sobes.tech
Junior — Middle

Kaip įgyvendinti tipų sumą (type sum) Go kalboje?

sobes.tech AI

Atsakymas iš AI

Go kalboje nėra tiesioginės paramos tipų sumai (type sum), kaip kai kuriose funkcionaliose kalbose (Haskell, Scala). Tačiau panašų efektą galima pasiekti naudojant interfeisus ir type switch.

Interfeisas Go apibūdina metodų rinkinį, ir bet kuris tipas, įgyvendinantis šiuos metodus, atitinka interfeisą. Norint įgyvendinti tipų sumą, galima apibrėžti metodų neturinį (tuščią) interface{} arba su bendrais metodais interfeisą, ir tada naudoti type switch, kad nustatytumėte konkretų tipą vykdymo metu.

Pavyzdys:

package main

import "fmt"

type Shape interface{} // tuščias interfeisas, gali būti bet koks tipas

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
}

Šiuo būdu, interfeisas ir type switch leidžia įgyvendinti elgseną, panašią į tipų sumą, kur kintamasis gali priimti skirtingų tipų reikšmes, ir priklausomai nuo tipo, vykdoma atitinkama logika.