Inicialização de Structs
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 9 de 107.
O Go oferece várias maneiras de inicializar structs, cada uma útil em diferentes situações.
Inicialização de campos nomeados
type Person struct {
Name string
Age int
City string
}
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Inicialização posicional (a ordem deve corresponder à declaração do campo)
p2 := Person{"Bob", 30, "London"}Inicialização com valor zero (todos os campos recebem valores padrão)
p3 := Person{}
// Name: "", Age: 0, City: ""
Inicialização parcial (campos não definidos recebem valores zero)
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""
Ponteiro para uma struct usando &
p5 := &Person{
Name: "Diana",
Age: 28,
City: "Paris",
}
fmt.Println(p5.Name) // DianaUsando var e depois atribuindo campos
var p6 Person
p6.Name = "Eve"
p6.Age = 22A inicialização de campos nomeados é a abordagem mais comum e legível. Use & quando você precisar de um ponteiro para a struct.
Desafio
MédioCrie três objetos Player usando diferentes métodos de inicialização:
- player1: Inicialização de campos nomeados usando os valores de entrada
- player2: Inicialização de campos nomeados com Name: "Guest", Class: "Novice", HitPoints: 50
- player3: Use a declaração
vare, em seguida, atribua cada campo individualmente
Folha de consulta
Go oferece várias maneiras de inicializar structs:
Inicialização de campos nomeados (mais comum e legível):
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Inicialização posicional (a ordem deve corresponder à declaração dos campos):
p2 := Person{"Bob", 30, "London"}Inicialização com valor zero (todos os campos recebem valores padrão):
p3 := Person{}
// Name: "", Age: 0, City: ""Inicialização parcial (campos não definidos recebem valores zero):
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""Ponteiro para uma struct usando &:
p5 := &Person{
Name: "Diana",
Age: 28,
}
fmt.Println(p5.Name) // DianaUsando var e depois atribuindo campos:
var p6 Person
p6.Name = "Eve"
p6.Age = 22Experimente você mesmo
package main
import "fmt"
func main() {
var name, class string
var hp int
fmt.Scan(&name, &class, &hp)
// TODO: Crie player1 usando inicialização de campos nomeados com os valores de entrada
// TODO: Crie player2 usando inicialização de campos nomeados:
// Name: "Guest", Class: "Novice", HitPoints: 50
// TODO: Crie player3 usando declaração var, depois atribua os campos:
// Name: "Hero", Class: "Knight", HitPoints: 200
fmt.Printf("Player 1: %s (%s) - HP: %d\n", player1.Name, player1.Class, player1.HitPoints)
fmt.Printf("Player 2: %s (%s) - HP: %d\n", player2.Name, player2.Class, player2.HitPoints)
fmt.Printf("Player 3: %s (%s) - HP: %d\n", player3.Name, player3.Class, player3.HitPoints)
}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