Tracks
/
Go
Go
/
Ejercicios
/
Need For Speed
Need For Speed

Need For Speed

Ejercicio de aprendizaje

Introducción

En Go, un struct es una secuencia de elementos con nombre llamados campos; cada campo tiene un nombre y un tipo. El nombre de un campo debe ser único dentro del struct. A los structs se los puede comparar con las clases del paradigma de la programación orientada a objetos.

Definir un struct

Para crear un nuevo struct usas las palabras clave type y struct, y defines explícitamente el nombre y el tipo de los campos. Por ejemplo, aquí definimos el struct Shape, que guarda el nombre de una figura y su tamaño:

type Shape struct {
    name string
    size int
}

Los nombres de los campos en los structs siguen la convención de Go: los campos cuyo nombre empieza con minúscula solo son visibles para el código del mismo paquete, mientras que los que empiezan con mayúscula son visibles en otros paquetes.

Crear instancias de un struct

Una vez que definiste el struct, necesitas crear una nueva instancia definiendo los campos con el nombre de cada campo, en cualquier orden:

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

Para leer o modificar los campos de una instancia, usa la notación .:

// 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

Los campos a los que no se les asigna un valor inicial tendrán su valor cero. Por ejemplo:

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

Puedes crear una instancia de un struct sin usar los nombres de los campos, siempre que definas los campos en orden:

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

Sin embargo, esta sintaxis se considera código frágil, ya que puede romperse cuando se agrega un campo, sobre todo si el campo nuevo es de un tipo diferente. En el siguiente ejemplo agregamos un campo extra 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{...}

Funciones «New»

A veces puede ser útil tener funciones que nos ayuden a crear instancias de structs. Por convención, estas funciones suelen llamarse New o tener nombres que empiezan con New, pero como son solo funciones normales, puedes darles el nombre que quieras. Puede que te recuerden a los constructores de otros lenguajes, pero en Go son solo funciones normales.

En el siguiente ejemplo, se usa una de estas funciones New para crear una nueva instancia de Shape y asignarle automáticamente un valor por defecto al size de la figura:

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

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

Usar funciones New puede tener las siguientes ventajas:

  • la validación de los valores dados
  • el manejo de valores por defecto
  • como las funciones New a menudo se declaran en el mismo paquete que los structs que inicializan, pueden inicializar incluso campos privados del struct

Instrucciones

En este ejercicio vas a organizar carreras entre distintos tipos de autos controlados a distancia. Cada auto tiene sus propias características de velocidad y de consumo de batería.

Los autos empiezan con la batería llena (100%). Cada vez que manejas el auto con el control remoto, avanza tantos metros como indique su velocidad y reduce el porcentaje de batería restante según su consumo de batería.

Si la batería de un auto queda por debajo de su porcentaje de consumo de batería, ya no puedes manejarlo.

Cada pista de carreras tiene su propia distancia. Los autos se ponen a prueba verificando si pueden terminar la pista sin quedarse sin batería.

1. Crea un auto controlado a distancia

Define un struct Car con los siguientes campos de tipo int:

  • battery
  • batteryDrain
  • speed
  • distance

Permite crear un auto controlado a distancia definiendo una función NewCar que recibe como sus dos parámetros la velocidad del auto en metros y el porcentaje de consumo de batería (ambos de tipo int), y devuelve una instancia de Car:

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

2. Crea una pista de carreras

Define otro tipo de struct llamado Track con el campo distance de tipo entero. Permite crear una pista de carreras definiendo una función NewTrack que recibe como único parámetro la distancia de la pista en metros (de tipo int):

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

3. Maneja el auto

Implementa la función Drive, que actualiza la cantidad de metros recorridos según la velocidad del auto y reduce la batería de acuerdo con su consumo. Si no hay batería suficiente para avanzar una vez más, el auto no se moverá:

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

4. Comprueba si un auto controlado a distancia puede terminar una carrera

Para terminar una carrera, un auto tiene que ser capaz de recorrer la distancia de la carrera. Es decir, no puede quedarse sin batería antes de cruzar la línea de meta. Implementa la función CanFinish, que recibe como parámetro una instancia de Car y una de Track, y devuelve true si el auto puede terminar la carrera; de lo contrario, devuelve false.

Supón que estás en la línea de salida de la carrera y que enciendes el motor del auto para arrancar. Ten en cuenta que la batería del auto no tiene por qué estar completamente cargada al empezar la carrera:

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

distance := 100
track := NewTrack(distance)

CanFinish(car, track)
// => true
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Need For Speed?

Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.