12/100 Dias de Golang - Pacotes e Módulos
Table of Contents
#
Pacotes e Módulos
Temos várias funções e tipos em Go, mas é importante organizar essas funções e tipos em pacotes. Um pacote é um conjunto de arquivos Go no mesmo diretório que compartilham o mesmo package statement no topo do arquivo. O package statement é a primeira linha de um arquivo Go e define o nome do pacote. Por exemplo, o pacote fmt é um pacote padrão em Go que fornece funções para formatação de entrada e saída. Golang possui ínumeros pacotes que são padrão da linguagem. No site pkg.go.dev você pode encontrar todos os pacotes padrão da linguagem e os pacotes de terceiros, veja o exemplo do pacote Gin, que é um framework web para Go. Vamos criar um pacote utils com diversas funções.
Dentro da pasta raiz do projeto, crie um diretório utils e dentro desse diretório crie um arquivo utils.go. Adicione o seguinte código no arquivo utils.go:
package utils
func Soma(a, b int) int {
return a + b
}
func Subtracao(a, b int) int {
return a - b
}
Agora, vamos criar um arquivo main.go na pasta raiz do projeto e adicionar o seguinte código:
package main
import (
"fmt"
"utils"
)
func main() {
fmt.Println("Soma:", utils.Soma(10, 5))
fmt.Println("Subtração:", utils.Subtracao(10, 5))
}
Se você executar o arquivo main.go, com o comando go run main.go, você verá a saída:
main.go:5:5: package utils is not in std (/usr/local/go/src/utils)
Para corrigir esse problema temos o go mod. Vamos iniciar nosso projeto com esse comando.
go mod init github.com/victorstein/firtsproject
Perceba que um arquivo go.mod foi criado na pasta raiz do projeto. Veja a estrutura desse arquivo:
module github.com/victorstein/firtsproject
go 1.24.0
Isso indica para o compilador Go que o diretório atual é um módulo e o nome do módulo é github.com/victorstein/firtsproject. Agora corrigimos o import no main.go, substituindo o import utils por github.com/victorstein/firtsproject/utils.
package main
import (
"fmt"
"github.com/victorstein/firtsproject/utils"
)
func main() {
fmt.Println("Soma:", utils.Soma(10, 5))
fmt.Println("Subtração:", utils.Subtracao(10, 5))
}
#
Exportação de módulos
Vamos criar mais uma função no arquivo utils.go, a função de Divisão.
func Divisao(a, b int) int {
return a / b
}
Antes de fazer essa divisão quero validar se o divisor é diferente de zero. Para isso, vamos criar uma função validaDivisor que recebe um argumento b do tipo int e retorna um valor booleano.
func validaDivisor(b int) bool {
return b != 0
}
Agora, vamos chamar a função validaDivisor dentro da função Divisao.
func Divisao(a, b int) int {
if validaDivisor(b) {
return a / b
}
return 0
}
Veja que a função validaDivisor começa com letra minúscula, isso indica que ela é privada e só pode ser acessada dentro do pacote utils. Se tentarmos chamar a função validaDivisor no arquivo main.go, teremos um erro de compilação.
./main.go:12:8: name validaDivisor not exported by package utils
Essa regra serve para qualquer função, variável ou tipo em Go. Se começar com letra maiúscula, ela será exportada e poderá ser acessada por outros pacotes. Se começar com letra minúscula, ela será privada e só poderá ser acessada dentro do pacote.
#
Instalação de pacotes de terceiros
Vamos fazer a instalação do pacote github.com/gin-gonic/gin. Para isso, execute o comando:
go get github.com/gin-gonic/gin
Perceba que o arquivo go.mod foi atualizado com a dependência do pacote gin e um novo arquivo go.sum foi criado. O arquivo go.sum é um arquivo de controle de versão de dependências, comparando com outras linguagens ele é o poetry.lock do Python ou o package-lock.json do Node.js.
#
Tidy
O comando go mod tidy remove qualquer dependência que não está sendo usada no projeto. O pacote gin não está sendo usado no projeto, então quando rodarmos o comando go mod tidy, ele será removido do arquivo go.mod. Ele “limpa” o arquivo go.mod removendo qualquer dependência que não está sendo usada no projeto.
go mod tidy
Porém ele faz um verificação contrária, caso você esteja usando uma dependência e ela não esteja no arquivo go.mod, ele adiciona a dependência no arquivo.