Google Go: Primeiros passos e exemplos | victor serta /blog
Instalando as ferramentas da Go
Se você é um usuário Windows, infelizmente ainda não tem como utilizar essa linguagem nesse sistema operacional, pois ela só foi liberada para Linux e Mac OS X. Neste artigo mostro os passos que fiz no Ubuntu 9.04 e, caso eles não funcionem com você, é possível ter mais informações no site oficial.
O projeto Go utiliza o repositório Mercurial para seus códigos-fonte, por isso se você não tem esse software instalado siga esses passos:
Com o Mercurial instalado, o próximo passo é definir as seguintes variáveis de ambiente (sinta-se à vontade para alterar os caminhos dos diretórios):
Caso você esteja rodando um sistema 64 bits defina o valor de GOARCH como "amd64″ (veja mais detalhes sobre cada variável de ambiente no site oficial). Para que você não precise toda vez definir essas variáveis, é possível adicioná-las no arquivo .bashrc.
Agora faça o clone do repositório:
Para compilar o Go você precisará do GCC, bibliotecas C padrão, o parser generator Bison, comando make e o editor ed instalado. Para isso, execute:
Se tudo deu certo irá aparecer o seguinte:
Com as ferramentas instaladas, agora vamos aos exemplos.
Exemplo1: Hello world
Abra seu editor de texto preferido e crie o arquivo hello.go:
Download de hello.go
Para cada plataforma um compilador e linker diferente é utilizado:
amd64: 6g (compilador) / 6l (linker)
386: 8g (compilador) / 8l (linker)
arm: 5g (compilador) / 8l (linker)
Aqui mostratei como compilar e "linkar" o código em 386:
Agora rode "./hello" e deverá ser impresso na tela "hello, world".
Exemplo 2: Programação concorrente
Uma das vantagens que o Google anunciou dessa linguagem é o suporte mais simples a programação para vários núcleos. Para testar isso resolvi fazer um programa de cálculo do valor de PI aproximado através da série de Gregory, assim como fiz em um artigo anterior sobre Java.
Abaixo está o código de pi.go:
//cria um canal com 4 buffers de float64
c := make(chan float64, 4);
//divide o calculo do PI em 4 partes que podem rodar independente
go calcular_valor_parcial_pi(1.0, 1000000, c);
go calcular_valor_parcial_pi(1000001, 2000000, c);
go calcular_valor_parcial_pi(2000001, 3000000, c);
go calcular_valor_parcial_pi(3000001, 4000000, c);
//recebe do canal a resposta das 4 execucoes do calculo
//a ordem que elas foram finalizadas nao importa
valor_parcial := <-c;
valor_parcial += <-c;
//o valor final do pi se da pelo multiplicacao por 4
pi := 4.0 * valor_parcial;
//imprime valor de pi calculado na tela
fmt.Printf("pi = %f n", pi);
func calcular_valor_parcial_pi(inicio float64, fim float64, c chan float64) {
var valor float64 = 0.0;
i := inicio;
for i < fim {
valor += math.Pow(-1.0, i + 1.0) / (2.0 * i - 1.0) ;
//coloca no canal qual a resposta do valor parcial a ser calculado
c <- valor;
Download de pi.go
Como pode ser visto, é muito simples criar uma aplicação que utilize o potencial dos processadores de múltiplos núcleos. É possível utilizar "go routines" quando se deseja rodar algo de forma assíncrona. Para isso, basta adicionar a palavra reservada "go" antes da chamada de um método (linhas 13, 14, 15 e 16). Como neste caso era necessário realizar a leitura e sincronização dos dados, utilizei um channel que foi criado na linha 10 através de make. O primeiro parâmetro é o tipo de dado do canal e o segundo o tamanho do buffer.
Na linha 43 é adicionado no channel o valor parcial calculado pela a chamada do método. Este, por sua vez, é lido nas linhas 20, 21, 22 e 23.
Simples, não? Porém nos testes que realizei em uma máquina dual core apenas foi utilizado 1 dos núcleos. Provavelmente é alguma limitação da versão disponível atualmente, pois segui a documentação do site da linguagem para essa implementação.
Exemplo 3: Servidor web
Também resolvi testar o atendimento de requisições HTTP através da Go. A seguir o código de uma aplicação que roda na porta 1234 e exibe algumas informações básicas do browser e da requisição.
//define o endereço e a função que trata as requisições
http.Handle("/teste_go", http.HandlerFunc(RequestHandler));
//aguarda conexão na porta 1234
//se aconteceu algum erro
panic("Erro: ", err.String());
//monta uma string com alguns parametros da requisicao
str :=  "<b>Protocol:</b> " + req.Proto + "<br/>" +
"<b>Method:</b> " + req.Method + "<br/>" +
"<b>User-Agent:</b> " + req.UserAgent;
//escreve string como resposta
Download de web.go
Com o código compilado e rodando acesse http://localhost:1234/teste_go no seu browser.
É difícil saber se uma nova linguagem será amplamente aceita e utilizada pela comunidade, por mais que tenha o Google por trás. Sem dúvida a Go possui muitas funcionalidades interessantes, mas o suporte a ponteiros e o fato de não rodar sobre uma máquina virtual podem definí-la como de baixo nível (em relação a Java e C#, por exemplo). Quem já programou em C++ pode ver na Go uma boa opção, já que ao contrário de C++ ela possui garbage collector e suporte fácil a programação concorrente.
Se você quiser estudar mais essa nova linguagem acesse seu site oficial e veja estes links de referência:
Breve introdução à Linguagem de Programação Go
Instalando o Google Go
Instalando a linguagem Go no Mac
8 Responses to "Google Go: Primeiros passos e exemplos"
Tweets that mention Google Go: Primeiros passos e exemplos « Victor V. Serta's Tech Blog -- Topsy.com
on novembro 17th, 2009 at 5:42 #
[...] This post was mentioned on Twitter by Victor V. S., Gustavo Gatto. Gustavo Gatto said: Google Go: Primeiros passos e exemplos, por Victor Serta http://bit.ly/1dkApd #googlego [...]
tommed	on novembro 17th, 2009 at 9:51 #
.: Figueiraujo :. » Google cria nova linguagem: Go!
on novembro 17th, 2009 at 20:21 #
[...] e servidor web. E o melhor, tudo em português bem brasileiro! Acesse o post no blog do autor, aqui nesse link, e [...]
Andre Figueiraujo	on novembro 17th, 2009 at 20:23 #
Olá, gostei muito do tutorial! Tanto que linkei no meu post sobre GO!
Ah sim, o link do meu post http://www.figueiraujo.com/2009/11/17/google-cria-nova-linguagem-go/
Victor Villela Serta	on novembro 17th, 2009 at 23:58 #
Programando con Go (El lenguaje de Programacion de Google) « Ubuntu Life
on novembro 18th, 2009 at 21:41 #
[...] "Go" podemos incluso crear un servidor web en apenas 4 lineas de codigo. Abre un editor de textos y copia el siguiente [...]