Menu
Coddy logo textTech

Exportado vs Não Exportado

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 52 de 68.

Em Go, a visibilidade de identificadores (variáveis, funções, tipos, etc.) é controlada por uma convenção de nomenclatura simples. Isso determina se o código de outros pacotes pode acessar seus identificadores.

Identificadores exportados começam com uma letra maiúscula e são acessíveis a partir de outros pacotes. Pense neles como "públicos" - eles podem ser usados por qualquer pessoa que importe seu pacote.

// Estes são exportados (públicos)
var Name string
func Calculate() int
type Person struct

Identificadores não exportados começam com uma letra minúscula e são acessíveis apenas dentro do mesmo pacote. Estes são "privados" ao seu pacote.

// Estes não são exportados (privados)
var age int
func helper() string
type config struct

Essa convenção de nomenclatura é a maneira do Go de controlar o acesso sem precisar de palavras-chave como public ou private. Quando você tenta usar um identificador não exportado de outro pacote, o Go retornará um erro de compilação porque esse identificador não é visível fora de seu pacote.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Fácil

Corrija os problemas de visibilidade em um pacote Go ajustando a convenção de nomenclatura para identificadores exportados e não exportados. Você trabalhará com um cenário simulado de múltiplos pacotes onde alguns identificadores estão nomeados incorretamente, causando erros de compilação ao serem acessados de outros pacotes.

Você receberá duas entradas:

  • Uma string contendo definições de pacotes no formato "package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1" (ex: "utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")
  • Uma string contendo tentativas de acesso no formato "accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3" (ex: "main.helper,main.Calculate,utils.Version")

Sua tarefa é:

  1. Analisar a primeira entrada dividindo-a por barras verticais (pipes) para obter as definições individuais de cada pacote
  2. Para cada definição de pacote, dividir por dois-pontos para obter o nome do pacote e seus identificadores
  3. Para cada definição de identificador, dividir por dois-pontos para obter o nome do identificador, o tipo e a visibilidade pretendida
  4. Criar uma função chamada fixIdentifierName que recebe o nome de um identificador e a visibilidade pretendida, e retorna o nome corrigido:
    • Se a visibilidade for "public", garanta que o identificador comece com uma letra maiúscula
    • Se a visibilidade for "private", garanta que o identificador comece com uma letra minúscula
  5. Exibir o cabeçalho da análise de pacotes: "=== PACKAGE VISIBILITY ANALYSIS ==="
  6. Para cada pacote, exibir as informações do pacote:
    • "Package: [package_name]"
    • Para cada identificador no pacote:
      • Se o nome do identificador precisar de correção: "- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])"
      • Se o nome do identificador estiver correto: "- [identifier_name] ([type]) (visibility: [visibility]) ✓"
    • Analisar a segunda entrada dividindo-a por vírgulas para obter as tentativas de acesso individuais
    • Para cada tentativa de acesso, dividir por pontos para obter o pacote que está acessando e o identificador que está sendo acessado
    • Exibir o cabeçalho da validação de acesso: "=== ACCESS VALIDATION ==="
    • Para cada tentativa de acesso, determinar se o acesso é válido:
      • Encontrar o pacote que contém o identificador
      • Verificar se o nome corrigido do identificador começa com uma letra maiúscula (exportado)
      • Se o identificador for exportado: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)"
      • Se o identificador não for exportado: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)"
      • Se o identificador não existir: "[accessing_package] accessing [target_package].[identifier_name]: ✗ NOT FOUND"
    • Contar e exibir as estatísticas de resumo:
      • "=== SUMMARY ==="
      • "Total packages analyzed: [number_of_packages]"
      • "Total identifiers processed: [total_number_of_identifiers]"
      • "Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]"
      • "Access attempts: [number_of_access_attempts]"
      • "Allowed accesses: [number_of_allowed_accesses]"
      • "Denied accesses: [number_of_denied_accesses]"
    • Exibir as recomendações finais:
      • Se houver identificadores que precisaram de correção: "Recommendation: Fix identifier naming to follow Go conventions"
      • Se todos os identificadores estiverem corretos: "All identifiers follow proper Go naming conventions"

Use o pacote strings para dividir as strings de entrada, o pacote fmt para saída formatada e funções de manipulação de string para verificar e modificar os nomes dos identificadores. Este desafio demonstra como a convenção de nomenclatura do Go controla a visibilidade do pacote e ajuda você a entender a diferença entre identificadores exportados e não exportados.

Folha de consulta

Go controla a visibilidade por meio de convenções de nomenclatura sem palavras-chave explícitas como public ou private.

Identificadores exportados começam com uma letra maiúscula e são acessíveis a partir de outros pacotes:

// Estes são exportados (públicos)
var Name string
func Calculate() int
type Person struct

Identificadores não exportados começam com uma letra minúscula e são acessíveis apenas dentro do mesmo pacote:

// Estes não são exportados (privados)
var age int
func helper() string
type config struct

Tentar acessar identificadores não exportados de outros pacotes resulta em erros de compilação.

Experimente você mesmo

package main

import (
	"fmt"
	"strings"
)

func main() {
	// Ler entrada
	var packageDefinitions string
	var accessAttempts string
	fmt.Scanln(&packageDefinitions)
	fmt.Scanln(&accessAttempts)

	// TODO: Escreva seu código abaixo
	
	// Criar a função fixIdentifierName
	
	// Analisar definições de pacotes
	
	// Exibir análise de pacotes
	
	// Analisar tentativas de acesso
	
	// Exibir validação de acesso
	
	// Calcular e exibir estatísticas de resumo
	
	// Exibir recomendações
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo