Recapitulação - Comportamento de Structs
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 11 de 68.
Desafio
FácilNeste desafio, você praticará a implementação de receptores de valor e de ponteiro criando um sistema simples de gerenciamento de retângulos. Você criará uma struct Rectangle e definirá dois tipos diferentes de métodos que demonstram quando usar cada tipo de receptor.
Você receberá três entradas:
- Uma string representando a largura do retângulo (ex:
"5.0") - Uma string representando a altura do retângulo (ex:
"3.0") - Uma string representando um fator de escala (ex:
"2.0")
Sua tarefa é:
- Definir uma struct
Rectanglecom dois campos:Width(float64) eHeight(float64) - Criar um método chamado
areacom um receptor de valor que calcula e retorna a área do retângulo (largura × altura) - Criar um método chamado
scalecom um receptor de ponteiro que multiplica tanto a largura quanto a altura pelo fator de escala fornecido - Analisar as entradas para criar uma instância de
Rectangle - Imprimir a área inicial usando o formato:
"Initial area: [area]" - Chamar o método
scalecom o fator de escala - Imprimir a área escalonada usando o formato:
"Scaled area: [area]"
Os valores da área devem ser exibidos como números inteiros quando forem inteiros (ex: 15 em vez de 15.0), mas com casas decimais quando necessário (ex: 15.5). Este desafio demonstra o princípio fundamental: use receptores de valor para métodos que apenas leem dados (como calcular a área) e receptores de ponteiro para métodos que modificam a struct original (como redimensionar as dimensões).
Experimente você mesmo
package main
import (
"fmt"
"strconv"
)
// TODO: Defina sua struct Rectangle aqui
// TODO: Implemente o método area com receptor de valor aqui
// TODO: Implemente o método scale com receptor de ponteiro aqui
func main() {
// Ler entrada
var widthStr string
var heightStr string
var scaleStr string
fmt.Scanln(&widthStr)
fmt.Scanln(&heightStr)
fmt.Scanln(&scaleStr)
// Converter entradas para float64
width, _ := strconv.ParseFloat(widthStr, 64)
height, _ := strconv.ParseFloat(heightStr, 64)
scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
// TODO: Criar instância de Rectangle e implementar a solução abaixo
// Imprimir área inicial
// fmt.Printf("Initial area: %.0f\n", initialArea) // Use este formato para a saída
// Escalar o retângulo
// Imprimir área escalada
// fmt.Printf("Scaled area: %.0f\n", scaledArea) // Use este formato para a saída
}Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos