You are on page 1of 18

Go Lang

A linguagem do Google

Suelen Goularte Carvalho


Instituto de Matemtica e Estatstica
Universidade de So Paulo

Junho/2015
Contents
1 Introduo 3
1.1 Por que uma nova linguagem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Go e sua histria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Verses e ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Quem est usando Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Instalando e desenvolvendo com Go 6


2.1 Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Declaraes curtas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Mltiplos retornos de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.7 Estrutura de lao for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.8 Estrutura de lao while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.9 Estrutura condicional if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.10 Estrutura condicional switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.11 Estrutura defer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.12 Outros recursos de Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.13 Web-service em Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3 Concorrncia com Goroutines 14

4 Channels 15
4.1 Unbuffered channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Buffered channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 Bibliografia 17
1 Introduo
1.1 Por que uma nova linguagem?

Em 2007 foi criada a linguagem de programao Go em resposta a alguns problemas enfrentados por ele ao
desenvolver sistemas que trabalham com a sua infraestrutura. Estes problemas surgiram a partir do uso de
processadores multincleos, sistemas distribudos em redes, computao massiva e modelo de computao
web, que apesar de tornar a computao muito mais potente, tambm agregou uma srie de complexidades.

Sistemas como estes possuem milhares de linhas de cdigo, com milhares de engenheiros de software
trabalhando todos os dias, o que resulta em processos de merge e compilao muito complexos e demorados.

Houveram tentativas frustradas de resolver alguns destes problemas com sistemas desenvolvidos em lin-
guagens j existentes, a maior parte deles em C++, Java e Python. E apesar de cada uma dessas linguagens
possurem caractersticas desejveis, o mais desejvel de fato, era encontrar todas estas caractersticas em
apenas uma linguagem.

Caractersticas como linguagem compilada, garbage-collector, estaticamente tipada, lidar com concor-
rncia, sntaxe simples dentre outras, foram renidas nesta nova linguagem denominada Go!

Go foi desenhada para e por pessoas que escrevem, lem, debugam e mantm grandes sistemas
de software.

1.2 Go e sua histria

Figure 1: Fundadores de Go. Robert Griesemer, Rob Pike e Ken Thompson

Go uma linguagem de programao compilada, concorrente, forte e estaticamente tipada.

3
Foi desenvolvida por engenheiros do Google em 2007 como um projeto de tempo parcial (figura 1). Seus
fundadores foram Ken Thompson, que participou de projetos como da linguagem B, C, Unix e UTF-8; Rob
Pike, que participou de projetos como Unix e UTF-8 e Robert Griesemer, que participou de projetos como
do Hotspot e JVM; alm de outros engenheiros do Google.

Em 2008, Go passou de um projeto de tempo parcial para um projeto de tempo integral no Google, e
com isso, muito outros engenheiros participaram, alm claro, dos fundadores. Em 2009, Go se tornou Open
Source e em 2010, comeou a ser adotada por desenvolvedores de fora do Google.

As principais caractersticas encontradas em Go so:

Compilada

Garbage-collected

Tem seu prprio Go Runtime

Sntaxe simples

Exclente pacote padro

Multiplataforma

Orientada a Objetos (sem herana)

Estaticamente e fortemente tipada

Concorrente

Compilada (goroutines)

Suporte a clossures

Dependncias explcitas

Funes com mltiplos retornos

Ponteiros

E muito mais.

Porm, algumas funcionalidades encontradas em outras linguagens, no sero vistas em Go, como por
exemplo:

Tratamento de erro

Herana

Generics

Assertions

Sobrecarga de mtodos

4
1.3 Verses e ferramentas

Go teve sua verso 1 lanada em 2012. Em 2013 foram lanadas as verses 1.1 e 1.2. No meio de 2014
foi lanada a verso 1.3 e ao final, foi lanada a verso 1.4. Seu pacote padro considerado muito bom e
completo por seus desenvolvedores, tornando desnecessrio o uso de dependncias externas e facilitando o
gerenciamento das mesmas.
Go tambm uma conjundo de ferramentas para o gerenciamento de cdigos desenvolvidos com ela.
Junto com a instalao de Go vem algumas ferramentas, dentre elas, as principais so:

build: compilar pacotes e suas dependncias;

run: compila e executa programas Go;

clean: remove arquivos extras de compilao e execuo;

env: imprime informaes do ambiente de desenvolvimento Go;

test: executa testes e benchmarks realizados com Go.

Alm destas existem outras como: fix, fmt, get, install, list, tool, version e vet.

1.4 Quem est usando Go

Atualmente muitas empresas tem aderido ao uso da linguagem Go. Naturalmente, o Google foi o primeiro a
us-la em projetos produtivos. Com o passar dos anos, outras empresas que possuem um contexto similar,
passaram a usar Go.

Na Figura 17 possvel ver algumas destas empresas. Uma lista completa pode ser encontrada em
https://github.com/golang/go/wiki/GoUsers

5
Figure 2: Empresas que usam a linguagem de programao Go

2 Instalando e desenvolvendo com Go


Para instalarmos Go basta fazer o download do arquivo compactado da linguagem no site https://golang.org/doc/install
e adicionar o diretrio bin a varivel de ambiente PATH.

Todo cdigo Go possui como extenso .go. Para execut-lo podemos digitar no terminal go run
seuArquivo.go, que ir compilar e executar o cdigo, ou go build seuArquivo.go e em seguida go run
seuArquivo.go, que ir respectivamente compilar e executar o programa Go.

Vamos agora conhecer algumas estruturas da linguagem de programao Go e entender um pouco sobre
seu funcionamento.

2.1 Pacotes

Cada programa em Go contido em um pacote,

Programas iniciam a partir do pacote main,

O exemplo a seguir est contido no pacote main e usa dependncias dos pacotes fmt e math.

6
Figure 3: Exemplo do uso de pacotes em Go

2.2 Variveis

A instruo var usada para declarar uma ou mais variveis,

O tipo deve ser informado aps o nome,

A instruo var pode ser usada no escopo de pacote ou de mtodo/funo,

A instruo var pode incluir inicializadores, um por varivel. Neste caso, no necessrio informar o
tipo pois o mesmo ser inferido.

Figure 4: Exemplo do uso de variveis em Go

2.3 Declaraes curtas

Dentro de uma funo, o operador de declarao curta :=, pode ser usado ao invs do operador var,

Ao usar o operador de declarao curta, o mesmo ir criar e inicializar a varivel,

O tipo da varivel ser inferido e definido na atribuio.

7
Figure 5: Exemplo do uso de declaraes curtas em Go

2.4 Constantes

Constantes seguem a mesma regra de declarao que as variveis, porm utilizada o operador const,

No pode ser usado o operador de declarao curta :=.

Figure 6: Exemplo do uso de constantes em Go

2.5 Funes

Para criar uma funo utilize a palavra chave func,

Os parmetros devem estar contidos entre parnteses, mesmo caso no haja parmetros,

As instrues da funo devem estar dentro de abre e fecha chaves,

8
Funes podem receber nenhum ou mais parmetros,

Repare que o tipo do parmetro tambm vem aps o nome, como na declarao de variveis.

Figure 7: Exemplo do uso de funes em Go

2.6 Mltiplos retornos de funes

Uma funo pode ter mltiplos retornos,

Ao retornar o valor da funo, devem ser informados todos os retornos,

Os retornos e seus tipos so informados aps os parnteses dos parmetros e antes da chave de abertura
das instrues. Caso haja somente um retorno, o parnteses pode ser omitido.

Figure 8: Exemplo do uso de funes com mltiplos retornos em Go

9
2.7 Estrutura de lao for

Go s possui uma estrutura de lao, o for,

Sua sntaxe muito similar as linguagens C ou Java, exceto por no ter obrigatoriamente os parnteses
e ter obrigatoriamente as chaves,

A varivel de controle do lao e seu incremento podem ser omitidos, ficando apenas a condio.

Figure 9: Exemplo do uso de lao for em Go

2.8 Estrutura de lao while

Os pontos e vrgulas podem ser removidos juntos com as condies de incio e incremento, restando
apenas a condio e desta forma, temos o while em Go,

Tambm possvel omitir todas as partes e ter um lao infinito.

Figure 10: Exemplo do uso de lao for em Go simulando um while

10
2.9 Estrutura condicional if

muito similar com C ou Java exceto por obrigatriamente no haver parnteses e obrigatriamente
haver chaves.

Figure 11: Exemplo do uso de if em Go

2.10 Estrutura condicional switch

muito similar com C ou Java exceto por obrigatriamente no haver parnteses e obrigatriamente
haver chaves.

11
Figure 12: Exemplo do uso de switch em Go

2.11 Estrutura defer

Posterga a execuo de uma funo, at que a funo chamadora termine,

Os argumentos passados para uma funo deferida, so resolvidos no momento de sua chamada, apesar
de a execuo ser realizada apenas ao final.

Figure 13: Exemplo do uso de switch em Go

12
2.12 Outros recursos de Go

Tivemos uma viso geral sobre Go passando pelas estruturas bsicas, mas ainda h muito mais sobre esta
linguagem que no iremos entrar em detalhes pois o objetivo deste trabalho no ser um tutorial de Go e
sim uma viso geral sobre a linguagem.

No entanto, segue uma lista sobre o que mais h para ver na linguagem:

Ponteiros

Struct

Matrix

Slice

Range

Map

Funo de valor

Closures

Mtodos

Interfaces

Stringer

Error

E muito mais.

disponibilizado online um passeio completo sobre cada item da linguagem em http://go-tour-br.appspot.com.

2.13 Web-service em Go

Para se ter ideia de como Go simples de usar, a seguir podemos visualizar um exemplo de implementao
de um web servide onde disponibilizado o endpoint / apontando para a funo index.

Em outras linguagens, como Java por exemplo, muito mais cdigo, arquivos de configurao e demais
seriam necessrios.

13
Figure 14: Exemplo de web-service em Go

3 Concorrncia com Goroutines


Em Go, concorrncia feita atravs da execuo de uma funo precedida da palavra chave go. Neste
momento, a Go Runtime se encarregar de criar processos e threads se achar necessrio, alm de usar a
configurao da varivel de ambiente GOMAXPROCS que informa a quantidade mxima de processos que Go
pode trabalhar.

Quando executamos uma funo precedido da palavra chave go, dizemos que temos uma goroutine.
Pois no sabemos se ser outra thread ou no, ento apenas generalizamos como goroutine.

Um trunfo de Go com relao ao paralelismo e concorrncia que, a deciso por paralelizar ou no os


trabalhos a serem realizados fica por conta dela, de forma que ela ir optar sempre pela melhor e mais rp-
ida forma de execuo, o que no quer dizer necessariamente que sero usados mais de um processo ou thread.

Isto pois, como de conhecimento geral, no necessariamente o fato de se ter vrios processos e threads,
implica obrigatoriamente em uma execuo mais rpida, isso por conta das sincronizaes e escalonamentos
necessrios, dentre outras aes que podem ser custosas quando se fala em mxima performance.

14
Figure 15: Exemplo de Go routine

4 Channels
Os channels so como condutes tipados pelo qual pode-se enviar e receber informaes de uma goroutine
a outra. Existem dois tipos de channels, os no buferizados (unbuffered channels) e os buferizados
(buffered channels).

4.1 Unbuffered channels

Channels no buferizados so usados para sincronizao entre duas goroutines. Uma vez que uma
goroutine coloca uma informao em um channel no buferizado, ela s ser liberada quando outra
goroutine pegar esta informao. Ou seja, neste tipo de channel, s pode existir uma informao por
vez e esta deve ser enviada e entregue em uma mesma transao.

15
Figure 16: Exemplo de channel no buferizado em Go

4.2 Buffered channels

Channels buferizados so usados para envio e recebimento assncrono de informaes entre 2 ou mais
goroutines. Buferizar um channel significa informar seu tamanho na sua declarao e desta forma ele
poder conter 0 ou at seu limite de informaes.

Uma goroutine pode colocar informaes em um channel at seu limite. Se um channel est cheio
e uma goroutine tenta colocar informaes nele, ela s ser liberada quando liberar um espao e puder
completar seu envio.

Uma goroutine pode pegar informaes de um channel enquanto ele for diferente houver, se uma
goroutine tenta pegar uma informao porm o channel est vazio, ela estar bloqueada at que haja
informao a ser recuperada, e ento o resgate da informao completo e a goroutine liberada.

16
Figure 17: Exemplo de channel buferizado Go

17
5 Bibliografia
http://golang.org

http://go-tour-br.appspot.com

https://tour.golang.org

http://www.golangbr.org

https://vimeo.com/49718712

http://gophercon.com

http://www.infoq.com/br/news/2014/09/go-1-3

http://www.casadocodigo.com.br/products/livro-google-go

https://pt.wikipedia.org/wiki/Inferno_(sistema_operacional)

http://www.grokpodcast.com/series/a-linguagem-go

https://pt.wikipedia.org/wiki/Go_(linguagem_de_programao)

https://gobyexample.com

http://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html

http://www.goinggo.net/2013/09/detecting-race-conditions-with-go.html?m=1

https://en.wikipedia.org/wiki/Green_threads

http://www.toptal.com/go/go-programming-a-step-by-step-introductory-tutorial

18

You might also like