Escolar Documentos
Profissional Documentos
Cultura Documentos
Golang - P.O.O
Golang - P.O.O
O
Programação Orientada a Objetos em Go
Introdução
A Programação Orientada a Objetos (POO) é um paradigma
fundamental na engenharia de software, e muitas linguagens
de programação, incluindo Go, suportam conceitos de POO.
No entanto, Go tem uma abordagem única para POO em
comparação com outras linguagens. Este artigo irá explorar os
conceitos de POO em Go com exemplos práticos.
package main
import "fmt"
// Definindo um tipo 'Pessoa'
type Pessoa struct {
Nome string
Idade int
}
// Adicionando um método 'Apresentar' ao tipo 'Pessoa'
func (p Pessoa) Apresentar() {
fmt.Printf("Olá, eu sou %s e tenho %d anos.\n", p.Nome,
p.Idade)
}
func main() {
// Criando uma instância da 'Pessoa'
pessoa := Pessoa{Nome: "Alice", Idade: 30}
// Chamando o método 'Apresentar'
pessoa.Apresentar()
}
Encapsulamento em Go
Go não possui modificadores de acesso tradicionais
como public, private ou protected. No entanto, podemos usar
convenções para alcançar o encapsulamento. Vamos modificar
nosso exemplo:
package main
import "fmt"
// Definindo um tipo 'Pessoa'
type Pessoa struct {
nome string // tornamos minúsculo para indicar que é
"privado"
idade int
}
// Adicionando um método 'SetNome' para modificar o campo 'nome'
func (p *Pessoa) SetNome(novoNome string) {
p.nome = novoNome
}
// Adicionando um método 'Apresentar' para acessar o campo 'nome'
func (p Pessoa) Apresentar() {
fmt.Printf("Olá, eu sou %s e tenho %d anos.\n", p.nome,
p.idade)
}
func main() {
pessoa := Pessoa{nome: "Alice", idade: 30}
// Chamando o método 'Apresentar'
pessoa.Apresentar()
// Modificando o nome usando o método 'SetNome'
pessoa.SetNome("Bob")
// Chamando novamente o método 'Apresentar'
pessoa.Apresentar()
}
package main
import "fmt"
// Definindo um tipo 'Animal'
type Animal struct {
Nome string
}
// Definindo um método 'FazerBarulho' para 'Animal'
func (a Animal) FazerBarulho() {
fmt.Println("Barulho genérico de animal.")
}
// Definindo um tipo 'Cachorro' que "herda" de 'Animal'
type Cachorro struct {
Animal // Composição
}
// Sobrescrevendo o método 'FazerBarulho' para 'Cachorro'
func (c Cachorro) FazerBarulho() {
fmt.Println("Au au!")
}
func main() {
cachorro := Cachorro{Animal: Animal{Nome: "Rex"}}
// Chamando o método 'FazerBarulho' do 'Cachorro'
cachorro.FazerBarulho()
// Chamando o método 'FazerBarulho' do 'Animal' (herança
"light")
cachorro.Animal.FazerBarulho()
}
package main
import "fmt"
// Definindo uma interface 'SerVivo' com um método 'Som'
type SerVivo interface {
Som() string
}
// Implementando 'SerVivo' para 'Cachorro'
type Cachorro struct{}
func (c Cachorro) Som() string {
return "Au au!"
}
// Implementando 'SerVivo' para 'Gato'
type Gato struct{}
func (g Gato) Som() string {
return "Miau!"
}
// Função que aceita qualquer coisa que implemente 'SerVivo'
func EmitirSom(s SerVivo) {
fmt.Println(s.Som())
}
func main() {
cachorro := Cachorro{}
gato := Gato{}
// Chamando a função 'EmitirSom' com diferentes tipos
EmitirSom(cachorro)
EmitirSom(gato)
}
Até á próxima!