Pular para o conteúdo principal

victorstein.dev

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.