A Linguagem de Programação Go
Descrição do livro
A linguagem de programação Go é a fonte mais confiável para qualquer programador que queira conhecer Go. O livro mostra como escrever código claro e idiomático em Go para resolver problemas do mundo real. Esta obra não pressupõe conhecimentos prévios de Go nem experiência com qualquer linguagem específica, portanto você a achará acessível, independentemente de se sentir mais à vontade com JavaScript, Ruby, Python, Java ou C++.
O primeiro capítulo contém um tutorial com os conceitos básicos de Go, apresentado por meio de programas para E/S de arquivos e processamento de texto, imagens gráficas simples, clientes e servidores web.
Os primeiros capítulos discutem os elementos estruturais de programas Go: sintaxe, controle de fluxo, tipos de dados e a organização de um programa em pacotes, arquivos e funções. Os exemplos apresentam muitos pacotes da biblioteca-padrão e mostram como criar seus próprios pacotes. Capítulos mais adiante explicam o sistema de pacotes com mais detalhes, além de mostrar como compilar, testar e manter projetos usando a ferramenta go.
Os capítulos sobre métodos e interfaces apresentam a abordagem não convencional de Go à programação orientada a objetos, em que métodos podem ser declarados em qualquer tipo e as interfaces são implicitamente satisfeitas. Esses capítulos explicam os princípios fundamentais de encapsulamento, composição e substituibilidade usando exemplos realistas.
Dois capítulos sobre concorrência apresentam abordagens detalhadas a esse assunto cada vez mais importante. O primeiro, que discute o sistema básico de gorrotinas e canais, apresenta o estilo conhecido como processos sequenciais comunicantes (communicating sequential processes) pelo qual Go é renomado. O segundo aborda aspectos mais tradicionais de concorrência com variáveis compartilhadas. Esses capítulos oferecem uma base sólida para programadores que estão entrando em contato com a concorrência pela primeira vez.
Os dois últimos capítulos exploram recursos de baixo nível de Go. Um dos capítulos aborda a arte da metaprogramação usando reflexão. O outro mostra como usar o pacote unsafe para desviar-se do sistema de tipos em situações especiais e como usar a ferramenta cgo para criar vínculos (bindings) de Go com bibliotecas em C.
Sumário
- Prefácio
- Origens de Go
- Projeto Go
- Como este livro está organizado
- Onde encontrar mais informações
- Agradecimentos
- 1 Tutorial
- 1.1 Hello, World
- 1.2 Argumentos de linha de comando
- 1.3 Encontrando linhas duplicadas
- 1.4 GIFs animados
- 1.5 Buscando um URL
- 1.6 Buscando URLs de modo concorrente
- 1.7 Um servidor web
- 1.8 Miscelâneas
- 2 Estrutura dos programas
- 2.1 Nomes
- 2.2 Declarações
- 2.3 Variáveis
- 2.3.1 Declarações curtas de variáveis
- 2.3.2 Ponteiros
- 2.3.3 A função new
- 2.3.4 Tempo de vida das variáveis
- 2.4 Atribuições
- 2.4.1 Atribuição de tupla
- 2.4.2 Possibilidade de atribuição
- 2.5 Declarações de tipos
- 2.6 Pacotes e arquivos
- 2.6.1 Importações
- 2.6.2 Inicialização de pacotes
- 2.7 Escopo
- 3 Tipos de dados básicos
- 3.1 Inteiros
- 3.2 Números de ponto flutuante
- 3.3 Números complexos
- 3.4 Booleanos
- 3.5 Strings
- 3.5.1 Strings literais
- 3.5.2 Unicode
- 3.5.3 UTF-8
- 3.5.4 Strings e fatias de bytes
- 3.5.5 Conversões entre strings e números
- 3.6 Constantes
- 3.6.1 Gerador de constantes iota
- 3.6.2 Constantes sem tipo
- 4 Tipos compostos
- 4.1 Arrays
- 4.2 Fatias
- 4.2.1 Função append
- 4.2.2 Técnicas in-place para fatias
- 4.3 Mapas
- 4.4 Estruturas
- 4.4.1 Estruturas literais
- 4.4.2 Comparando estruturas
- 4.4.3 Inclusão de estruturas e campos anônimos
- 4.5 JSON
- 4.6 Templates de texto e HTML
- 5 Funções
- 5.1 Declarações de funções
- 5.2 Recursão
- 5.3 Múltiplos valores de retorno
- 5.4 Erros
- 5.4.1 Estratégias de tratamento de erros
- 5.4.2 Fim de arquivo (EOF)
- 5.5 Valores função
- 5.6 Funções anônimas
- 5.6.1 Cuidado: captura de variáveis de iteração
- 5.7 Funções variádicas
- 5.8 Chamadas de função adiadas
- 5.9 Pânico
- 5.10 Recuperação
- 6 Métodos
- 6.1 Declarações de métodos
- 6.2 Métodos cujo receptor é um ponteiro
- 6.2.1 Nil é um valor válido de receptor
- 6.3 Compondo tipos por meio de inclusão de estruturas
- 6.4 Valores e expressões método
- 6.5 Exemplo: tipo vetor de bits
- 6.6 Encapsulamento
- 7 Interfaces
- 7.1 Interfaces como contratos
- 7.2 Tipos interface
- 7.3 Como satisfazer uma interface
- 7.4 Fazendo parse de flags com flag Value
- 7.5 Valores interface
- 7.5.1 Ressalva: uma interface contendo um ponteiro nil não é nil
- 7.6 Ordenação com sort Interface
- 7.7 A interface http Handler
- 7.8 Interface error
- 7.9 Exemplo: avaliador de expressões
- 7.10 Asserções de tipo
- 7.11 Diferenciando erros com asserções de tipo
- 7.12 Consultando comportamentos com asserções de tipo interface
- 7.13 Switches de tipo
- 7.14 Exemplo: decodificação de XML baseada em token
- 7.15 Alguns conselhos
- 8 Gorrotinas e canais
- 8.1 Gorrotinas
- 8.2 Exemplo: Servidor de relógio concorrente
- 8.3 Exemplo: Servidor de eco concorrente
- 8.4 Canais
- 8.4.1 Canais sem buffer
- 8.4.2 Pipelines
- 8.4.3 Canais unidirecionais
- 8.4.4 Canais com buffer
- 8.5 Looping em paralelo
- 8.6 Exemplo: Web crawler concorrente
- 8.7 Multiplexando com select
- 8.8 Exemplo: Travessia concorrente de diretório
- 8.9 Cancelamento
- 8.10 Exemplo: Servidor de bate-papo
- 9 Concorrência com variáveis compartilhadas
- 9.1 Condições de concorrência
- 9.2 Exclusão mútua: sync Mutex
- 9.3 Mutexes de leitura/escrita: sync RWMutex
- 9.4 Sincronização de memória
- 9.5 Inicialização lazy: sync Once
- 9.6 O detector de concorrência
- 9.7 Exemplo: Cache concorrente não bloqueante
- 9.8 Gorrotinas e threads
- 9.8.1 Pilhas que podem aumentar
- 9.8.2 Escalonamento de gorrotinas
- 9.8.3 GOMAXPROCS
- 9.8.4 Gorrotinas não têm identidade
- 10 Pacotes e a ferramenta go
- 10.1 Introdução
- 10.2 Caminhos de importação
- 10.3 A declaração do pacote
- 10.4 Declarações de importação
- 10.5 Importações vazias
- 10.6 Pacotes e nomenclatura
- 10.7 Ferramenta go
- 10.7.1 Organização do workspace
- 10.7.2 Fazendo download de pacotes
- 10.7.3 Build de pacotes
- 10.7.4 Documentando pacotes
- 10.7.5 Pacotes internos
- 10.7.6 Consulta de pacotes
- 11 Testes
- 11.1 A ferramenta go test
- 11.2 Funções Test
- 11.2.1 Testes aleatórios
- 11.2.2 Testando um comando
- 11.2.3 Testes caixa-branca
- 11.2.4 Pacotes de testes externos
- 11.2.5 Escrevendo testes eficazes
- 11.2.6 Evitando testes frágeis
- 11.3 Cobertura
- 11.4 Funções Benchmark
- 11.5 Profiling
- 11.6 Funções Example
- 12 Reflexão
- 12.1 Por que usar reflexão?
- 12.2 reflect Type e reflect Value
- 12.3 Display: um printer recursivo de valores
- 12.4 Exemplo: Codificando expressões-S
- 12.5 Atualizando variáveis com reflect Value
- 12.6 Exemplo: Decodificando expressões-S
- 12.7 Acessando tags de campos de estrutura
- 12.8 Exibindo os métodos de um tipo
- 12.9 Uma advertência
- 13 Programação de baixo nível
- 13.1 unsafe Sizeof, Alignof e Offsetof
- 13.2 unsafe Pointer
- 13.3 Exemplo: Equivalência profunda
- 13.4 Chamando código C com cgo
- 13.5 Outra advertência
Sobre os autores
Alan A. A. Donovan é membro da equipe de Go do Google em Nova York. Estudou ciência da computação em Cambridge e no MIT, e trabalha com programação no mercado desde 1996. A partir de 2005, passou a trabalhar para o Google em projetos de infraestrutura e foi coprojetista do Blaze, o sistema proprietário de build dessa empresa. Criou várias bibliotecas… Ver perfil completo ▶
Brian W. Kernighan é professor do departamento de ciência da computação da Universidade de Princeton. Participou da equipe técnica do Computing Science Research Center do Bell Labs de 1969 até o ano 2000, onde trabalhou com linguagens e ferramentas para Unix. É coautor de vários livros, incluindo C: A linguagem de programação – padrão ANSI… Ver perfil completo ▶
Livros relacionados
Recursos
Opinião dos leitores
Horácio D B N
Livro muito bom, aborda a Linguagem Go de ponta a ponta.
Rodolfo d N A
Excelente, claro, direto e realmente expõe um conhecimento essencial para qualquer programador Go.
Diego P
Um ótimo livro que explica por que o Go foi criado da forma que é hoje. Ajuda muito a entender a filosofia por trás da linguagem.
Daniel G T P
A tradução é ótima! O livro é bem detalhado e cheio de exemplos.






