Olá OtavioVB, tudo bem?
Complementando ao isaqueveras, um package em Golang é usado para indicar onde as funcionalidades similares estão. É como se fosse uma biblioteca e em todos os livros estivessem escrito o nome da biblioteca ao qual estes livros fazem parte.
Por exemplo: Estou na biblioteca X e meu livro Go Horse tem em seu prefácio escrito que faz parte da biblioteca X.
A diferença entre Golang, C#, PHP e Java é que Golang unifica nos packages funcionalidades que não são classes (já que em Go não tem classes, mas algo próximo a isso como structs), ou seja, são métodos, funções que se fazem parte do contexto que o pacote se propõe a resolver.
Como descrito na referência em GeekForGeeks:
- Os packages são a parte mais poderosa da linguagem Go.
- A finalidade de um package é projetar e manter um grande número de programas agrupando recursos relacionados em unidades únicas para que possam ser fáceis de manter e entender e independentes dos outros programas de pacote.
- Essa modularidade permite que eles compartilhem e reutilizem.
- Na linguagem Go, cada pacote é definido com um nome diferente e esse nome está próximo de sua funcionalidade como pacote “strings” e contém métodos e funções que se relacionam apenas com strings.
Para entender um pouco melhor, trago também exemplo de packages em Java conforme a W3Schools:
- Um package em java é usado para agrupar classes relacionadas.
- Pense nisso como uma pasta em um diretório de arquivos.
- Nós usamos packages para:
- Evitar conflitos com nomes
- Para escrever um código de melhor manutenção
- Packages são dividos em duas categorias:
- Built-in Packages (packages do Java API)
- User-defined Packages (Seus próprios packages customizados)
E sobre namespaces, de acordo com a Microsoft:
O .NET usa namespaces para organizar suas muitas classes...
A Microsoft também traz uma visão geral sobre os namespaces:
- Eles organizam projetos de códigos grandes.
- Eles são delimitados usando o . operador.
- A diretiva using elimina a necessidade de especificar o nome do namespace para cada classe.
- O namespace global é o namespace "raiz": global::System sempre fará referência ao namespace do .NET System.
Referências: