Professional Documents
Culture Documents
A linguagem do Google
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
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.
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.
Compilada
Garbage-collected
Sntaxe simples
Multiplataforma
Concorrente
Compilada (goroutines)
Suporte a clossures
Dependncias explcitas
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:
Alm destas existem outras como: fix, fmt, get, install, list, tool, version e vet.
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
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
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 pode incluir inicializadores, um por varivel. Neste caso, no necessrio informar o
tipo pois o mesmo ser inferido.
Dentro de uma funo, o operador de declarao curta :=, pode ser usado ao invs do operador var,
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,
2.5 Funes
Os parmetros devem estar contidos entre parnteses, mesmo caso no haja parmetros,
8
Funes podem receber nenhum ou mais parmetros,
Repare que o tipo do parmetro tambm vem aps o nome, como na declarao de variveis.
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.
9
2.7 Estrutura de lao 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.
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,
10
2.9 Estrutura condicional if
muito similar com C ou Java exceto por obrigatriamente no haver parnteses e obrigatriamente
haver chaves.
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
Os argumentos passados para uma funo deferida, so resolvidos no momento de sua chamada, apesar
de a execuo ser realizada apenas ao final.
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.
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
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.
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).
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
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