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.