Go é uma linguagem estranha?
- #GoLang
Ao nos depararmos com a linguagem de programação Go pela primeira vez, ela nos parece uma linguagem muito diferente das demais, muitos lhe dão o adjetivo de "um pouco estranha", até mesmo alguns desenvolvedores experientes ficam meio confusos quando observam a sintaxe e a estrutura de código de um programa em Go pela primeira vez, especialmente pela forma como essa linguagem lida com o paradigma de orientação a objetos.
As linguagens orientadas a objetos mais populares trabalham baseadas em classes e objetos, já Go não possuí classes, mas possuí em seu lugar um tipo de dado chamado struct para realizar o armazenamento de estados (para realizar um papel semelhante aos atributos) e funções que atuam sobre esses tipos struct (para realizar um papel semelhante aos métodos).
Para nosso exemplo vou utilizar como modelo uma entidade denominada Criatura:
Segue seu diagrama UML:
A entidade acima seria implementada em Go da seguinte maneira:
package main
import "fmt"
type Criatura struct {
Nome string
Idade int
}
func (this *Criatura) Descricao() {
fmt.Printf("Nome: %s, Idade: %d", this.nome, this.idade)
}
No exemplo acima criamos uma estrutura de dados de nome 'Criatura' e uma função para atuar sobre essa estrutura, vamos chamar essa função de ‘Descricao’ conforme nosso diagrama UML.
Nesse momento muitos podem estar pensando: usar structs para modelar classes em OO não parece estranho?
A resposta é não! Go não foi a primeira linguagem a utilizar structs para modelar OO, além disso a própria definição de objeto segundo a Wikipedia diz:
“Objeto em ciência da computação, é uma referência a um local da memória que possui um valor. Um objeto pode ser uma variável, função, ou estrutura de dados.”
Podemos definir objetos como uma estrutura de dados que possuí estados (variáveis) e comportamentos (funções) e é exatamente isso que vemos em Golang.
C/C++ e Go
Como dito anteriormente, Go não é a primeira linguagem a utilizar structs para inserir a modelagem orientada a objetos em sua sintaxe. C e C++ também permitem utilizar structs para modelar, mesmo que não integralmente, a orientação a objetos.
Em C++ podemos declarar funções dentro de structs, fazendo a struct ter o papel de uma classe e sua implemetações se comportarem como objetos.
Veja uma implementação de nosso diagrama uml escrito em C++:
struct Criatura {
string nome;
int idade;
void descricao();
};
void Criatura::descricao() {
cout << "Nome:" << nome << " " << "idade:" << idade;
}
Por default todas os membros dessa struct tem visibilidade pública, mas podemos atribuir restrições de visibilidade da mesma forma que nas classes
Veja o código:
struct Criatura {
private:
int idade;
public:
string nome;
void descricao();
};
Agora qualquer acesso ao campo idade fora da função membro 'descricao' será impedido.
C++ também oferece uma palavra reservada denominada 'class' para a declaração de classes. A diferença é que em uma classe definida com class, o acesso aos campos é privado por default.
Agora vamos ver uma implementação completa do código:
#include
using namespace std;
struct Criatura {
string nome;
int idade;
void descricao();
};
void Criatura::descricao() {
cout << "Nome:" << nome << " " << "idade:" << idade;
}
int main()
{
Criatura dragao;
dragao.idade = 12;
dragao.nome = "Dragon";
dragao.descricao();
return 0;
}
Notou as semelhanças com o Go no momento de declarar a classe como struct, no momento de atribuir uma funçao membro de forma eterna ao corpo da struct, e também na forma como os métodos e atributos são invocados.
Conclusão
O objetivo desse artigo foi familiarizar o leitor com os conceitos da linguagem Go. Vimos as semelhanças da linguagem Go com o C++, fazendo uma comparação dos recursos tidos como "excêntricos" na linguagem em relação aos conceitos de orientação a objetos.
Até a próxima!