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.