Sobes.tech
Junior — Middle

Como implementar a soma de variantes de tipos (type sum) na linguagem Go?

sobes.tech IA

Resposta da IA

Em Go, não há suporte direto para tipos soma (type sum), como em algumas linguagens funcionais (Haskell, Scala). No entanto, um efeito semelhante pode ser alcançado usando interfaces e switch de tipo.

Uma interface em Go descreve um conjunto de métodos, e qualquer tipo que implemente esses métodos satisfaz a interface. Para implementar tipos soma, pode-se definir uma interface sem métodos (interface vazia interface{}) ou com métodos comuns, e então usar um switch de tipo para determinar o tipo em tempo de execução.

Exemplo:

package main

import "fmt"

type Shape interface{} // interface vazia, pode ser qualquer tipo

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
}

Dessa forma, a interface e o switch de tipo permitem implementar um comportamento semelhante à soma de tipos, onde a variável pode assumir valores de diferentes tipos, e dependendo do tipo, a lógica correspondente é executada.