Funções Construtoras
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 10 de 107.
Go não possui construtores como outras linguagens. Em vez disso, a convenção é criar uma função chamada NewTypeName que retorna uma struct inicializada, frequentemente como um ponteiro.
Função construtora básica
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}Construtor com valores padrão
type Config struct {
Host string
Port int
Timeout int
}
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // Default value
Timeout: 30, // Default value
}
}Construtor com validação
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}Usando funções construtoras
func main() {
p1 := NewPerson("Alice", 25)
fmt.Println(p1.Name) // Alice
p2 := NewPerson("", -5)
fmt.Println(p2.Name) // Unknown
fmt.Println(p2.Age) // 0
}Funções construtoras retornam um ponteiro (*StructName) usando &. Isso evita a cópia da struct e permite que métodos com receptores de ponteiro funcionem diretamente. Validação e valores padrão ficam dentro do construtor.
Desafio
MédioCrie uma função construtora NewBankAccount para a struct BankAccount com validação:
- Recebe
name(string) ebalance(float64) como parâmetros - Se
nameestiver vazio, o padrão deve ser"Unnamed" - Se
balancefor negativo, o padrão deve ser0 - Defina
Ownercomo"Default Owner"sempre - Retorne um ponteiro para a nova struct
Folha de consulta
Go usa funções construtoras em vez de construtores. A convenção é nomeá-las como NewTypeName e retornar um ponteiro para a struct inicializada.
Função construtora básica:
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}Construtor com valores padrão:
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // Valor padrão
Timeout: 30, // Valor padrão
}
}Construtor com validação:
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}Funções construtoras retornam um ponteiro (*StructName) usando & para evitar a cópia da struct e permitir que métodos com receptor de ponteiro funcionem diretamente.
Experimente você mesmo
package main
import "fmt"
func main() {
var name string
var balance float64
fmt.Scan(&name, &balance)
account := NewBankAccount(name, balance)
fmt.Printf("Account: %s\n", account.Name)
fmt.Printf("Balance: %.2f\n", account.Balance)
fmt.Printf("Owner: %s\n", account.Owner)
}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