Menu
Coddy logo textTech

Definire metodi sugli struct

Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 6 di 68.

In Go, un metodo è una funzione che appartiene a un tipo specifico. A differenza delle funzioni normali, che sono indipendenti, i metodi sono associati alle struct e ti permettono di definire il comportamento dei tuoi tipi di dati personalizzati.

Per definire un metodo, inserisci un receiver tra la parola chiave func e il nome del metodo. Il receiver specifica a quale tipo appartiene il metodo.

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

In questo esempio, (p Person) è il ricevitore, il che rende greet un metodo del tipo Person. La variabile p rappresenta l’istanza di Person su cui viene chiamato il metodo, in modo simile a this in altri linguaggi.

Puoi quindi chiamare il metodo usando la notazione con il punto su qualsiasi istanza di Person, dando alle tue struct la possibilità di eseguire azioni relative ai loro dati.

challenge icon

Sfida

Facile

In questa sfida, ti eserciterai a definire metodi su struct creando un semplice sistema di gestione dei libri. Creerai una struct Book e definirai metodi che consentono al libro di mostrare le sue informazioni.

Nota importante: Poiché i titoli dei libri e i nomi degli autori possono contenere spazi, dovrai usare bufio.Scanner per leggere intere righe di input. La funzione fmt.Scanln smette di leggere al primo spazio, interrompendo così i titoli e i nomi degli autori composti da più parole. Usa bufio.NewScanner(os.Stdin) e chiama scanner.Scan() seguito da scanner.Text() per leggere le righe complete.

Riceverai tre input:

  • Una stringa che rappresenta il titolo del libro (ad es., "The Go Programming Language")
  • Una stringa che rappresenta il nome dell'autore (ad es., "Alan Donovan")
  • Una stringa che rappresenta il numero di pagine (ad es., "380")

Il tuo compito è:

  1. Definire una struct Book con tre campi: Title (stringa), Author (stringa) e Pages (int)
  2. Creare un metodo chiamato displayInfo con un receiver per valore che stampi le informazioni del libro nel formato: "Title: [title], Author: [author], Pages: [pages]"
  3. Creare un metodo chiamato getDescription con un receiver per valore che restituisca una stringa nel formato: "[title] by [author]"
  4. Usare bufio.Scanner per leggere correttamente le righe di input:
    • Creare uno scanner: scanner := bufio.NewScanner(os.Stdin)
    • Per ogni riga di input: chiamare scanner.Scan() e poi scanner.Text()
    • In questo modo i titoli e i nomi degli autori contenenti spazi vengono letti correttamente
  5. Analizzare gli input per creare un'istanza di Book
  6. Chiamare il metodo displayInfo per stampare le informazioni del libro
  7. Chiamare il metodo getDescription e stampare la descrizione restituita

I metodi devono usare la variabile receiver per accedere ai campi della struct ed eseguire le rispettive operazioni. Ricorda che i metodi con receiver per valore operano su una copia dell'istanza della struct.

Provalo tu

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

// TODO: Definisci qui la struct Book

// TODO: Definisci qui il metodo displayInfo

// TODO: Definisci qui il metodo getDescription

func main() {
    // Crea uno scanner per leggere le righe di input
    scanner := bufio.NewScanner(os.Stdin)
    
    // Leggi il titolo
    scanner.Scan()
    title := scanner.Text()
    
    // Leggi l'autore
    scanner.Scan()
    author := scanner.Text()
    
    // Leggi il numero di pagine
    scanner.Scan()
    pagesStr := scanner.Text()
    
    // Converti la stringa delle pagine in un numero intero
    pages, _ := strconv.Atoi(pagesStr)
    
    // TODO: Crea un'istanza di Book e chiama i metodi
    
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online