Em Go (Golang), a Programação Orientada a Objetos (POO) é diferente de linguagens como Java ou Python, pois Go não possui classes. No entanto, podemos usar structs, métodos e interfaces para implementar os conceitos de POO, como encapsulamento, herança e polimorfismo.
1️⃣ Definindo uma “Classe” com Struct e Métodos
Em Go, usamos structs para representar objetos e métodos para definir comportamentos.
package main
import "fmt"
// Definição da struct Pessoa (equivalente a uma classe)
type Pessoa struct {
Nome string
Idade int
}
// Método para obter o nome
func (p Pessoa) GetNome() string {
return p.Nome
}
// Método para modificar o nome
func (p *Pessoa) SetNome(nome string) {
p.Nome = nome
}
// Método para obter a idade
func (p Pessoa) GetIdade() int {
return p.Idade
}
// Método para modificar a idade
func (p *Pessoa) SetIdade(idade int) {
p.Idade = idade
}
// Método para exibir os dados da pessoa
func (p Pessoa) Apresentar() {
fmt.Printf("Olá, meu nome é %s e tenho %d anos.\n", p.Nome, p.Idade)
}
func main() {
// Criando um objeto da struct Pessoa
pessoa := Pessoa{Nome: "João", Idade: 25}
pessoa.Apresentar() // Olá, meu nome é João e tenho 25 anos.
pessoa.SetIdade(30)
fmt.Println("Nova idade:", pessoa.GetIdade()) // Nova idade: 30
}✅ Explicação:
Pessoaé uma struct que representa um objeto.- Métodos como
GetNomeeSetIdadesão usados para acessar e modificar os dados. - O
*Pessoaindica um ponteiro, permitindo modificar os atributos diretamente. - No
main(), criamos uma instância dePessoa, alteramos valores e chamamos métodos.
2️⃣ Simulando Herança com Composição
Go não suporta herança diretamente, mas podemos usar composição para reutilizar código.
package main
import "fmt"
// Struct Pessoa (classe base)
type Pessoa struct {
Nome string
Idade int
}
// Método da struct Pessoa
func (p Pessoa) Apresentar() {
fmt.Printf("Meu nome é %s e tenho %d anos.\n", p.Nome, p.Idade)
}
// Struct Aluno que contém um campo do tipo Pessoa
type Aluno struct {
Pessoa // Composição (Aluno "herda" de Pessoa)
Curso string
}
// Método específico de Aluno
func (a Aluno) Estudar() {
fmt.Printf("%s está estudando %s.\n", a.Nome, a.Curso)
}
func main() {
aluno := Aluno{
Pessoa: Pessoa{Nome: "Ana", Idade: 22},
Curso: "Engenharia",
}
aluno.Apresentar() // Meu nome é Ana e tenho 22 anos.
aluno.Estudar() // Ana está estudando Engenharia.
}✅ Explicação:
Aluno“herda” dePessoapor composição.- O método
Apresentar()dePessoapode ser chamado emAluno. Alunotambém tem seu próprio métodoEstudar().
3️⃣ Polimorfismo com Interfaces
Go usa interfaces para implementar polimorfismo.
package main
import "fmt"
// Definição da interface
type SerHumano interface {
Apresentar()
}
// Struct Pessoa
type Pessoa struct {
Nome string
Idade int
}
// Implementando a interface SerHumano
func (p Pessoa) Apresentar() {
fmt.Printf("Sou %s e tenho %d anos.\n", p.Nome, p.Idade)
}
// Struct Aluno
type Aluno struct {
Pessoa
Curso string
}
// Implementando a interface SerHumano para Aluno
func (a Aluno) Apresentar() {
fmt.Printf("Sou %s, tenho %d anos e estudo %s.\n", a.Nome, a.Idade, a.Curso)
}
// Função que aceita qualquer SerHumano
func ApresentarPessoa(s SerHumano) {
s.Apresentar()
}
func main() {
pessoa := Pessoa{Nome: "Carlos", Idade: 40}
aluno := Aluno{Pessoa: Pessoa{Nome: "Mariana", Idade: 20}, Curso: "Medicina"}
ApresentarPessoa(pessoa) // Sou Carlos e tenho 40 anos.
ApresentarPessoa(aluno) // Sou Mariana, tenho 20 anos e estudo Medicina.
}✅ Explicação:
- Criamos a interface
SerHumanocom o métodoApresentar(). PessoaeAlunoimplementam essa interface.- A função
ApresentarPessoa()aceita qualquer struct que implementeSerHumano, demonstrando polimorfismo.
Conclusão
Em Go, POO é baseada em structs, métodos e interfaces:
✅ Encapsulamento → Usamos métodos para acessar/modificar campos.
✅ Herança → Usamos composição (uma struct dentro de outra).
✅ Polimorfismo → Usamos interfaces.
Go é simples e eficiente, evitando abstrações complexas. Se precisar de mais detalhes, me avise! 🚀