Sobes.tech
Middle+

Compare a implementação da programação orientada a objetos em Go e C#.

sobes.tech IA

Resposta da IA

Em Go, não há herança orientada a objetos clássica nem classes no sentido tradicional. Em vez disso, Go usa composição e interfaces.

Principais diferenças:

  • Classes e objetos: C# baseia-se em classes, das quais se criam objetos. Go usa estruturas (structs), que podem ter métodos.
  • Herança: C# suporta herança simples e múltipla (através de interfaces). Go suporta composição (inclusão de estruturas) e polimorfismo através de interfaces.
  • Interfaces: Em C#, as interfaces devem ser implementadas explicitamente pela classe. Em Go, as interfaces são implementadas implicitamente: se uma estrutura tem métodos que correspondem à assinatura da interface, ela a implementa automaticamente.
  • Visibilidade (Modificadores de acesso): Em C#, usa-se public, private, protected, internal. Em Go, a visibilidade é determinada pela primeira letra do nome: maiúscula, público; minúscula, privado (dentro do pacote).
  • Genéricos: C# tem um sistema avançado de genéricos. Go adicionou suporte a genéricos a partir da versão 1.18.

Exemplo de composição em Go:

package main

import "fmt"

type Engine struct {
	Type string
}

func (e Engine) Start() {
	fmt.Printf("%s engine started!\n", e.Type)
}

type Car struct {
	Model string
	Engine // Inclusão anónima - composição
}

func main() {
	myCar := Car{
		Model: "Sedan",
		Engine: Engine{
			Type: "Petrol",
		},
	}
	fmt.Printf("Car model: %s\n", myCar.Model)
	myCar.Start() // Chamada do método da estrutura embutida
}

Exemplo de implementação de interface em Go:

package main

import "fmt"

type Speaker interface {
	Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
	return "Woof!"
}

type Cat struct{}

func (c Cat) Speak() string {
	return "Meow!"
}

func main() {
	animals := []Speaker{Dog{}, Cat{}} // Slice de tipos que implementam a interface Speaker
	for _, animal := range animals {
		fmt.Println(animal.Speak())
	}
}

Na tabela:

Característica Go C#
Classes Não (estruturas) Sim
Objetos Instâncias de estruturas Instâncias de classes
Hereditariedade Composição, interfaces Clássica (simples), interfaces
Interfaces Implementação implícita Implementação explícita
Visibilidade Primeira letra maiúscula public, private, protected, etc.
Genéricos Desde a versão 1.18 Sim

A abordagem de Go para POO é mais descentralizada e focada no comportamento (através de interfaces) e na estrutura de dados (através de inclusão), o que muitas vezes leva a um código mais flexível e facilmente testável. C# mantém um modelo mais tradicional e hierárquico.