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.
Sfida
FacileIn 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 è:
- Definire una struct
Bookcon tre campi:Title(stringa),Author(stringa) ePages(int) - Creare un metodo chiamato
displayInfocon un receiver per valore che stampi le informazioni del libro nel formato:"Title: [title], Author: [author], Pages: [pages]" - Creare un metodo chiamato
getDescriptioncon un receiver per valore che restituisca una stringa nel formato:"[title] by [author]" - Usare
bufio.Scannerper leggere correttamente le righe di input:- Creare uno scanner:
scanner := bufio.NewScanner(os.Stdin) - Per ogni riga di input: chiamare
scanner.Scan()e poiscanner.Text() - In questo modo i titoli e i nomi degli autori contenenti spazi vengono letti correttamente
- Creare uno scanner:
- Analizzare gli input per creare un'istanza di
Book - Chiamare il metodo
displayInfoper stampare le informazioni del libro - Chiamare il metodo
getDescriptione 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
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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