Boas Práticas e Padrões Idiomáticos em Go e C

Nem sempre boas práticas são consideradas design patterns formais. Porém, quando uma técnica se torna a única forma eficaz de resolver problemas recorrentes, ela deixa de ser apenas "higiene de código" e passa a funcionar como um padrão idiomático da linguagem.

Este documento explora como structs, composição e interfaces em Go (e até em C) podem ser vistos como soluções de design aplicando esses princípios para um bom código. O texto começa explicando o uso em C de ponteiros e faz uma analogia sobre injeção de código de POO. Este documento tem por objetivo de tornar um dia um desgin para GO ou até C, QUE SÃO PROCEDURAIS. É um exemplo onde você não resolve bem uma questão sem esse principio de que se você não usar, você não resolve da melhor maneira. O documento é trabalhado nas fases seguintes com o argumento de porque usar ou não usar para justificar um design.

[ Hits: 137 ]

Por: trogmaiu em 25/03/2026


Boas Práticas e Padrões Idiomáticos em Go e C



O objetivo de criar esse documento é servir como orientação ou design para GO que é uma linguagem procedural, algo como SOLID.
É possível fazer uma analogia entre GO com STRUCT, INTERFACES e COMPOSIÇÃO com SOLID, a ideia e pegar o por que de usar STRUCT, INTERFACES e COMPOSIÇÃO, e o que de errado seria não usar, ou o porquê de ser uma melhor forma; então vamos por partes.
Esse documento foi produzido utilizando inteligência artificial
É algo novo em cima do que já existe para uma boa programação em GO, e até em C, pois C não possui interfaces, mas boa parte da ideia é utilizada para melhorar e ter algo mais definido para construção dos projetos e ajudar na codificação, manutenção e legibilidade do código.
Algumas partes do documento exibem partes da conversa com as inteligências virtuais.

Motivos para usar ponteiros em C/C++
O objetivo aqui é mostrar boas práticas em C e o porquê de usar ponteiros, mas a ideia é virar um design em procedural, mais especificamente em GO, e até em C, pois muito do que já é usado possui diversas formas de codificar.
Um exemplo sem ponteiros em algumas questões é quase impossível de resolver ou impossível, aqui é somente um reforço para o que será explicado a seguir em programação orientada a objetos.
Especificamente em UML, existem alguns conceitos que você dificilmente vai aprender na faculdade.
É quase impossível você fazer um bom projeto em POO sem usar injeção de dependências e uma analogia com ponteiros.

Explicação de ponteiros

Os ponteiros são uma das ferramentas mais poderosas da linguagem C e C++. Eles permitem manipular diretamente endereços de memória e trazem várias vantagens:
- Acesso direto à memória: você pode acessar e modificar variáveis em locais específicos da memória.
- Eficiência: passar ponteiros para funções evita cópia de grandes estruturas ou arrays, economizando tempo e memória.
- Manipulação de arrays e strings: ponteiros são essenciais para trabalhar com vetores e cadeias de caracteres.
- Estruturas dinâmicas: permitem criar listas ligadas, árvores e outras estruturas que dependem de alocação dinâmica.
- Interoperabilidade: ponteiros são usados para interagir com hardware, bibliotecas e sistemas operacionais.

Exemplo de erro sem ponteiro
Imagine que você queira escrever uma função que altere o valor de uma variável dentro dela:
C
#include
void alteraValor(int x) {
    x = 20; // altera apenas a cópia
}
int main() {
    int numero = 10;
    alteraValor(numero);
    printf("Numero: %d\n", numero); // continua 10
    return 0;
}
O problema:
Aqui, a função recebe uma cópia da variável numero. Alterar x não afeta o original. Resultado: o valor não muda.

Solução usando ponteiro:
C
#include
void alteraValor(int *x) {
    *x = 20; // altera o valor no endereço original
}
int main() {
    int numero = 10;
    alteraValor(&numero);
    printf("Numero: %d\n", numero); // agora é 20
    return 0;
}
O motivo:
Ao passar um ponteiro (&numero), a função recebe o endereço da variável original. Assim, ao modificar *x, você altera diretamente o valor armazenado na memória, e não apenas uma cópia.

Manipulação de arrays e strings: ponteiros são essenciais para trabalhar com vetores e cadeias de caracteres?
Ótimo ponto! Vamos ver na prática como ponteiros são essenciais para manipular arrays e strings em C.

1. Arrays e Ponteiros

Em C, o nome de um array é, na verdade, um ponteiro para o primeiro elemento. Isso significa que podemos percorrer o array usando ponteiros:
C
#include 
int main() {
    int numeros[] = {10, 20, 30, 40, 50};
    int *ptr = numeros; // ponteiro para o primeiro elemento
    for (int i = 0; i < 5; i++) {
        printf("Elemento %d: %d\n", i, *(ptr + i));
    }
    return 0;
}
O que acontece:
- numeros é equivalente a &numeros[0].
- *(ptr + i) acessa o valor na posição i.
- Isso mostra como ponteiros permitem percorrer arrays sem usar índices diretamente.

2. Strings e Ponteiros

Strings em C são arrays de caracteres terminados em \0. Ponteiros são usados para manipular cada caractere:
C
#include 
int main() {
    char texto[] = "Copilot";
    char *p = texto;
    while (*p != '\0') {
        printf("%c ", *p); // imprime caractere atual
        p++;               // avança para o próximo
    }
    return 0;
}
O que acontece:
- p aponta para o primeiro caractere da string.
- *p acessa o caractere atual.
- p++ move o ponteiro para o próximo caractere.
- Isso permite percorrer a string sem precisar de índices.

3. Exemplo de Função que Manipula String com Ponteiro

C
#include 
void maiuscula(char *s) {
    while (*s != '\0') {
        if (*s >= 'a' && *s <= 'z') {
            *s = *s - 32; // converte para maiúscula
        }
        s++;
    }
}
int main() {
char palavra[] = "ponteiros";
maiuscula(palavra);
printf("Resultado: %s\n", palavra);
return 0;
}
O motivo:
- A função recebe um ponteiro para a string.
- Alterações feitas em *s afetam diretamente a string original.
- Sem ponteiros, seria impossível modificar a string passada para a função sem retornar uma cópia.

Conversa com Coplilot, sobre o que ele acha da ideia de um desgin para o GO.
O Copilot disse:
"Perfeito, entendi sua ideia: você quer construir uma espécie de guia de orientação/diretrizes de design para Go, inspirado em princípios como o SOLID do mundo orientado a objetos, mas adaptado ao estilo procedural/estrutural de Go.
Go não é orientado a objetos no sentido clássico (não tem herança, classes), mas oferece structs, interfaces e composição como mecanismos para organizar código. Então, sim, dá para traçar uma analogia com SOLID e mostrar porque usar essas construções e o que acontece se NÃO USAR."
    Próxima página

Páginas do artigo
   1. Boas Práticas e Padrões Idiomáticos em Go e C
   2. EXPLICAÇÃO 1
   3. EXPLICAÇÃO 2
   4. EXPLICAÇÃO 3
   5. CONCLUSÃO
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Dynamic libraries com libtool

Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

Android NDK: Desmistificando o acesso a códigos nativos em C

O Produtor e o Consumidor

Programação de Jogos com SDL

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts