Riepilogo - comportamento degli struct
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 11 di 68.
Sfida
FacileIn questa sfida, ti eserciterai a implementare sia i receiver di valore sia i receiver puntatore creando un semplice sistema di gestione dei rettangoli. Creerai una struct Rectangle e definirai due diversi tipi di metodi che mostrano quando usare ciascun tipo di receiver.
Riceverai tre input:
- Una stringa che rappresenta la larghezza del rettangolo (ad es.,
"5.0") - Una stringa che rappresenta l'altezza del rettangolo (ad es.,
"3.0") - Una stringa che rappresenta un fattore di scala (ad es.,
"2.0")
Il tuo compito è:
- Definire una struct
Rectanglecon due campi:Width(float64) eHeight(float64) - Creare un metodo chiamato
areacon un receiver di valore che calcoli e restituisca l'area del rettangolo (larghezza × altezza) - Creare un metodo chiamato
scalecon un receiver puntatore che moltiplichi sia la larghezza sia l'altezza per il fattore di scala specificato - Analizzare gli input per creare un'istanza di
Rectangle - Stampare l'area iniziale usando il formato:
"Initial area: [area]" - Chiamare il metodo
scalecon il fattore di scala - Stampare l'area dopo la scalatura usando il formato:
"Scaled area: [area]"
I valori dell'area dovrebbero essere visualizzati come numeri interi quando sono interi (ad es., 15 invece di 15.0), ma con cifre decimali quando necessario (ad es., 15.5). Questa sfida dimostra il principio fondamentale: usa receiver di valore per i metodi che leggono soltanto i dati (come il calcolo dell'area) e receiver puntatore per i metodi che modificano la struct originale (come la scalatura delle dimensioni).
Provalo tu
package main
import (
"fmt"
"strconv"
)
// TODO: Definisci qui la struct Rectangle
// TODO: Implementa qui il metodo area con un ricevitore per valore
// TODO: Implementa qui il metodo scale con un ricevitore per puntatore
func main() {
// Leggi l'input
var widthStr string
var heightStr string
var scaleStr string
fmt.Scanln(&widthStr)
fmt.Scanln(&heightStr)
fmt.Scanln(&scaleStr)
// Converti gli input in float64
width, _ := strconv.ParseFloat(widthStr, 64)
height, _ := strconv.ParseFloat(heightStr, 64)
scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
// TODO: Crea un'istanza di Rectangle e implementa la soluzione qui sotto
// Stampa l'area iniziale
// fmt.Printf("Initial area: %.0f\n", initialArea) // Usa questo formato per l'output
// Ridimensiona il rettangolo
// Stampa l'area dopo il ridimensionamento
// fmt.Printf("Scaled area: %.0f\n", scaledArea) // Usa questo formato per l'output
}Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online