Sobes.tech
Назад к вопросам
Junior — Middle
76

Каким образом можно реализовать сумму вариантов типов (type sum) в языке Go?

Ответ от нейросети

sobes.tech AI

В Go нет прямой поддержки суммы типов (type sum), как, например, в некоторых функциональных языках (Haskell, Scala). Однако, похожий эффект можно достичь с помощью интерфейсов и type switch.

Интерфейс в Go описывает набор методов, и любой тип, реализующий эти методы, удовлетворяет интерфейсу. Для реализации суммы типов можно определить интерфейс без методов (пустой интерфейс interface{}) или с общими методами, а затем использовать type switch для определения конкретного типа во время выполнения.

Пример:

package main

import "fmt"

type Shape interface{} // пустой интерфейс, может быть любым типом

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
}

Таким образом, интерфейс и type switch позволяют реализовать поведение, похожее на сумму типов, где переменная может принимать значения разных типов, и в зависимости от типа выполняется соответствующая логика.