Track
/
Go
Go
/
Esercizi
/
Need for Speed
Need for Speed

Need for Speed

Esercizio di apprendimento

Introduzione

In Go, una struct è una sequenza di elementi con un nome, chiamati campi, e ogni campo ha un nome e un tipo. Il nome di un campo deve essere univoco all'interno della struct. Le struct si possono paragonare alle classi del paradigma della programmazione orientata agli oggetti.

Definire una struct

Per creare una nuova struct si usano le parole chiave type e struct, definendo esplicitamente il nome e il tipo dei campi. Ad esempio, qui definiamo la struct Shape, che contiene il nome di una forma e la sua dimensione:

type Shape struct {
    name string
    size int
}

I nomi dei campi nelle struct seguono la convenzione di Go: i campi il cui nome inizia con una lettera minuscola sono visibili solo al codice dello stesso package, mentre quelli il cui nome inizia con una lettera maiuscola sono visibili anche negli altri package.

Creare istanze di una struct

Una volta definita la struct, per creare una nuova istanza devi definire i campi usando il loro nome, in qualsiasi ordine:

s := Shape {
    name: "Square",
    size: 25,
}

Per leggere o modificare i campi di un'istanza, usa la notazione .:

// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35

I campi a cui non viene assegnato un valore iniziale avranno il loro valore zero. Ad esempio:

s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0

Puoi creare un'istanza di una struct senza usare i nomi dei campi, a patto di definire i campi in ordine:

s := Shape {
	"Oval",
	20,
}

Tuttavia, questa sintassi è considerata codice fragile, perché può rompersi quando si aggiunge un campo, soprattutto se il nuovo campo è di un tipo diverso. Nell'esempio seguente aggiungiamo un campo in più a Shape:

type Shape struct {
	name        string
	description string // new field 'description' added
	size        int
}

s := Shape{
    "Circle",
    20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}

Funzioni «New»

A volte può essere utile avere delle funzioni che ci aiutano a creare istanze di una struct. Per convenzione, queste funzioni di solito si chiamano New o hanno un nome che inizia con New, ma dato che sono normali funzioni, puoi dare loro il nome che preferisci. Potrebbero ricordarti i costruttori di altri linguaggi, ma in Go sono normali funzioni.

Nell'esempio seguente, una di queste funzioni New viene usata per creare una nuova istanza di Shape e impostare automaticamente un valore predefinito per la size della forma:

func NewShape(name string) Shape {
	return Shape{
		name: name,
		size: 100, //default-value for size is 100
	}
}

NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }

Usare le funzioni New può avere i seguenti vantaggi:

  • la validazione dei valori forniti
  • la gestione dei valori predefiniti
  • dato che le funzioni New sono spesso dichiarate nello stesso package delle struct che inizializzano, possono inizializzare anche i campi privati della struct

Istruzioni

In questo esercizio organizzerai gare tra vari tipi di auto radiocomandate. Ogni auto ha le proprie caratteristiche di velocità e di consumo della batteria.

Le auto partono con la batteria carica al 100%. Ogni volta che guidi l'auto con il radiocomando, questa percorre un numero di metri pari alla sua velocità e la percentuale di batteria rimanente diminuisce del suo consumo.

Se la batteria di un'auto è inferiore alla sua percentuale di consumo, non puoi più guidarla.

Ogni pista di gara ha una propria distanza. Le auto vengono messe alla prova verificando se riescono a completare la pista senza esaurire la batteria.

1. Crea un'auto radiocomandata

Definisci una struct Car con i seguenti campi di tipo int:

  • battery
  • batteryDrain
  • speed
  • distance

Per creare un'auto radiocomandata, definisci una funzione NewCar che prende come parametri la velocità dell'auto in metri e la percentuale di consumo della batteria (entrambi di tipo int) e restituisce un'istanza di Car:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
// => Car{speed: 5, batteryDrain: 2, battery:100, distance: 0}

2. Crea una pista di gara

Definisci un'altra struct chiamata Track con il campo distance di tipo intero. Per creare una pista di gara, definisci una funzione NewTrack che prende come unico parametro la distanza della pista in metri (di tipo int):

distance := 800
track := NewTrack(distance)
// => Track{distance: 800}

3. Guida l'auto

Implementa la funzione Drive che aggiorna il numero di metri percorsi in base alla velocità dell'auto e riduce la batteria in base al consumo. Se la batteria non è sufficiente per un'altra guida, l'auto non si muove:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car = Drive(car)
// => Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}

4. Verifica se un'auto radiocomandata può completare una gara

Per completare una gara, un'auto deve riuscire a percorrere la distanza della gara. Questo significa non esaurire la batteria prima di aver tagliato il traguardo. Implementa la funzione CanFinish che prende come parametri un'istanza di Car e una di Track e restituisce true se l'auto può completare la gara, altrimenti restituisce false.

Supponi di trovarti sulla linea di partenza della gara e di accendere il motore dell'auto per la gara. Tieni presente che la batteria dell'auto potrebbe non essere necessariamente carica del tutto quando inizia la gara:

speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)

distance := 100
track := NewTrack(distance)

CanFinish(car, track)
// => true
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Go Exercism

Vuoi iniziare Need for Speed?

Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.