Recapitulação - Calculadora Simples
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 11 de 107.
Desafio
DifícilConstrua uma Calculator completa usando tudo o que você aprendeu:
- Struct (Campos Exportados) — Defina
CalculatorcomName(string),LastResult(float64), eHistory(int) - Função Construtora —
NewCalculator(name string)retorna*Calculator. Se o nome estiver vazio, use o padrão"Unnamed" - Value Receiver —
GetInfo()retorna o nome da calculadora como uma string formatada - Pointer Receivers —
Add,Subtract,Multiplycada um armazena o resultado emLastResulte incrementaHistory - Divide — pointer receiver retornando
(float64, string). Se dividir por zero, retorne0e"Error: division by zero"sem atualizarHistoryouLastResult
Experimente você mesmo
package main
import "fmt"
func main() {
var name string
var a, b float64
fmt.Scan(&name, &a, &b)
calc := NewCalculator(name)
fmt.Println(calc.GetInfo())
fmt.Printf("History: %d\n", calc.History)
fmt.Printf("%.0f + %.0f = %.2f\n", a, b, calc.Add(a, b))
fmt.Printf("%.0f - %.0f = %.2f\n", a, b, calc.Subtract(a, b))
fmt.Printf("%.0f * %.0f = %.2f\n", a, b, calc.Multiply(a, b))
result, err := calc.Divide(a, b)
if err != "" {
fmt.Println(err)
} else {
fmt.Printf("%.0f / %.0f = %.2f\n", a, b, result)
}
fmt.Printf("History: %d\n", calc.History)
fmt.Printf("Last Result: %.2f\n", calc.LastResult)
}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