Da trilha de Go Este conceito ainda não saiu como card do dia. ir para o card de hoje

Go Módulos Intermediário

Pacotes e módulos

Em Go, pacotes são a unidade básica de organização do código. Todo arquivo .go pertence a um pacote, declarado na primeira linha com package nome. Isso permite agrupar funções, tipos e variáveis relacionadas, além de controlar o que é visível fora do pacote: identificadores que começam com letra maiúscula são exportados (públicos), enquanto os que começam com minúscula são privados ao pacote.

Para gerenciar dependências e versões, Go usa módulos, definidos pelo arquivo go.mod. Um módulo é uma coleção de pacotes versionados juntos. O comando go mod init exemplo.com/meumodulo cria o go.mod com o nome do módulo e a versão do Go. A partir daí, imports internos usam esse caminho como prefixo.

A organização de pastas segue a estrutura de diretórios: cada pasta é um pacote, e o nome do pacote geralmente coincide com o nome da pasta. O compilador Go trata subdiretórios como pacotes separados. Já o diretório especial internal restringe o acesso: pacotes dentro de internal só podem ser importados por código que esteja na árvore de diretórios acima dele.

Neste card, vamos criar um módulo com múltiplos pacotes, incluindo um pacote internal, e demonstrar como a exportação por maiúscula e a estrutura de pastas funcionam na prática.

Pontos-chave

  • Todo arquivo Go pertence a um pacote, declarado com package nome.
  • Identificadores com inicial maiúscula são exportados (públicos); com minúscula, privados ao pacote.
  • O arquivo go.mod define o módulo e suas dependências; é criado com go mod init.
  • Cada diretório é um pacote separado; o nome do pacote deve coincidir com o nome da pasta (exceto main).
  • O diretório internal restringe imports: só pode ser usado por pacotes na mesma árvore de diretórios.
main.go
// main.go
package main

import (
	"fmt"
	"meumodulo/internal/saudacao"
	"meumodulo/matematica"
)

func main() {
	// Usa função exportada do pacote matematica
	soma := matematica.Somar(3, 4)
	fmt.Println("Soma:", soma)

	// Usa função exportada do pacote internal/saudacao
	msg := saudacao.Ola("Go")
	fmt.Println(msg)

	// Tentar acessar matematica.dobro (minúsculo) causaria erro de compilação
	// fmt.Println(matematica.dobro(5)) // descomente para ver o erro
}

Exercícios

  1. 1
    Fácil

    Criando um pacote exportado

    Crie um módulo chamado exemplo.com/calculadora com um pacote calculadora que exporte uma função Multiplicar(a, b int) int. No main.go, importe o pacote e use a função para multiplicar 6 por 7, imprimindo o resultado.

    Resolver
  2. 2
    Médio

    Usando pacote internal

    Crie um módulo exemplo.com/loja com um pacote internal/precos que exporte a função ComDesconto(valor float64) float64 (aplicando 10% de desconto). No main.go, importe e use essa função para calcular o preço de um produto de R$ 100,00. Imprima o valor com desconto formatado com duas casas decimais.

    Resolver
  3. 3
    Desafio

    Módulo com múltiplos pacotes e internal

    Crie um módulo exemplo.com/empresa com a seguinte estrutura:

    • Pacote funcionarios (em funcionarios/) que exporte a struct Funcionario com campos Nome (string) e Salario (float64), e uma função NovoFuncionario(nome string, salario float64) Funcionario.
    • Pacote internal/folha (em internal/folha/) que exporte a função CalcularTotal(funcs []funcionarios.Funcionario) float64.
    • main.go que cria dois funcionários, calcula o total da folha e imprime no formato Total da folha: R$ 7500.00.

    Use valores: Ana com 5000.00 e Bruno com 2500.00.

    Resolver

Continue estudando