Nomes Exportados vs Não Exportados
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 4 de 107.
Em Go, a primeira letra de um nome determina sua visibilidade. Nomes que começam com uma letra maiúscula são exportados (acessíveis a partir de outros pacotes). Nomes que começam com uma letra minúscula são não exportados (privados ao pacote).
Nomes exportados — visíveis fora do pacote
type User struct {
Name string // Campo exportado
Email string // Campo exportado
}
func CreateUser(name string) User { // Função exportada
return User{Name: name}
}Nomes não exportados — visíveis apenas dentro do pacote
type secret struct { // Struct não exportada
password string // Campo não exportado
}
func validate() bool { // Função não exportada
return true
}Misto — struct exportada com alguns campos não exportados
type Account struct {
Username string // Exportado - acessível em qualquer lugar
Email string // Exportado - acessível em qualquer lugar
password string // Não exportado - apenas dentro do pacote
}Esta convenção de nomenclatura substitui modificadores de acesso como public e private encontrados em outras linguagens.
// Letra maiúscula = Exportado (público)
// Letra minúscula = Não exportado (privado)
func SaveData() {} // Exportado
func loadData() {} // Não exportadoSeguir essa convenção é essencial em Go. Quando outros pacotes importam seu código, eles só podem acessar nomes que começam com uma letra maiúscula.
Desafio
MédioCorrija todos os nomes em product.go para seguir a convenção de nomenclatura exportada do Go. Coloque a primeira letra em maiúscula de:
- O nome da struct:
product→Product - Todos os nomes de campos:
name,price,stock - Todos os nomes de funções:
totalValue,displayInfo - Todas as referências de campos dentro das funções
Folha de consulta
Em Go, a primeira letra de um nome determina sua visibilidade:
- Letra maiúscula = Exportado (acessível a partir de outros pacotes)
- Letra minúscula = Não exportado (privado ao pacote)
Nomes exportados:
type User struct {
Name string // Campo exportado
Email string // Campo exportado
}
func CreateUser(name string) User { // Função exportada
return User{Name: name}
}Nomes não exportados:
type secret struct { // Struct não exportada
password string // Campo não exportado
}
func validate() bool { // Função não exportada
return true
}Visibilidade mista:
type Account struct {
Username string // Exportado - acessível em qualquer lugar
Email string // Exportado - acessível em qualquer lugar
password string // Não exportado - apenas dentro do pacote
}Esta convenção de nomenclatura substitui modificadores de acesso como public e private encontrados em outras linguagens.
Experimente você mesmo
package main
import "fmt"
func main() {
var name string
var price float64
var stock int
fmt.Scan(&name, &price, &stock)
p := Product{
Name: name,
Price: price,
Stock: stock,
}
fmt.Println(DisplayInfo(p))
fmt.Printf("Total Value: %.2f\n", TotalValue(p))
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool