Criando erros customizados com errors.New e fmt.Errorf
Em Go, erros são valores. Essa filosofia fundamental é concretizada pela interface nativa error, que possui um único método:
Categoria
Em Go, erros são valores. Essa filosofia fundamental é concretizada pela interface nativa error, que possui um único método:
Cross-compilation é a capacidade de gerar binários executáveis para um sistema operacional e arquitetura diferentes da máquina onde o código está sendo compilado. Em muitas linguagens, isso exige configurações complexas, toolchains específicas e bibliotecas compiladas para cada alvo. Em Go, essa tarefa é surpreendentemente simples e nativa.
Em Go, a forma mais tradicional de declarar variáveis é usando a palavra-chave var. A sintaxe básica coloca o tipo após o nome da variável, diferentemente de linguagens como C ou Java:
O modelo de concorrência de Go, baseado em goroutines e canais, é particularmente poderoso quando combinado com operações de I/O. O pacote io fornece interfaces fundamentais como Reader e Writer que são naturalmente compatíveis com esse modelo.
Aplicações modernas em Go exigem flexibilidade na obtenção de configurações. Usar variáveis de ambiente brutas com os.Getenv ou flags simples com o pacote flag rapidamente se torna insustentável à medida que o número de parâmetros cresce. É aí que entra o Viper, a biblioteca de configuração mais popular do ecossistema Go.
Constraints em Go são mecanismos que definem quais tipos podem ser utilizados como argumentos de tipo em funções e tipos genéricos. Elas surgiram no Go 1.18 para resolver a necessidade de escrever código genérico sem sacrificar a segurança de tipos.
Antes da introdução do pacote context na biblioteca padrão do Go, o gerenciamento de concorrência era feito manualmente com canais e variáveis compartilhadas. Isso gerava código propenso a vazamentos de goroutines e difícil de manter. Por exemplo, para cancelar uma operação concorrente, era comum usar um canal done como sinalizador:
Em Go, a estrutura condicional if segue uma sintaxe limpa e direta, sem os parênteses obrigatórios encontrados em linguagens como C, Java ou JavaScript. As chaves, no entanto, são obrigatórias — mesmo para blocos de uma única linha.
Channels com buffer em Golang são canais que possuem uma capacidade interna de armazenamento, permitindo que dados sejam enviados sem que haja um receptor imediato. Diferentemente dos channels sem buffer, onde o envio bloqueia até que outra goroutine receba o dado, os channels com buffer oferecem um espaço temporário para armazenar mensagens.
Quando trabalhamos com concorrência em Go, um dos maiores desafios é coordenar o acesso a dados compartilhados entre múltiplas goroutines. Sem uma estratégia adequada, somos rapidamente confrontados com condições de corrida (race conditions), onde o resultado da execução depende da ordem imprevisível de acesso concorrente.