Rutas
/
Go
Go
/
Ejercicios
/
Necesidad de velocidad
Necesidad de velocidad

Necesidad de velocidad

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. Los structs se pueden 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 contiene el nombre de una forma y su tamaño:

type Shape struct {
    name string
    size int
}

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

Crear instancias de un struct

Una vez que has definido el struct, tienes que 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 añade un campo, sobre todo si el nuevo campo es de un tipo diferente. En el siguiente ejemplo añadimos 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 resultar útil tener funciones que nos ayuden a crear instancias de un struct. Por convención, estas funciones suelen llamarse New o tener nombres que empiezan con New, pero como son funciones normales, puedes ponerles el nombre que quieras. Puede que te recuerden a los constructores de otros lenguajes, pero en Go son simplemente funciones normales.

En el siguiente ejemplo, se usa una de estas funciones New para crear una nueva instancia de Shape y establecer automáticamente un valor predeterminado para el size de la 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 }

Usar funciones New puede tener las siguientes ventajas:

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

Instrucciones

En este ejercicio vas a organizar carreras entre varios tipos de coches teledirigidos. Cada coche tiene sus propias características de velocidad y descarga de batería.

Los coches empiezan con las baterías llenas (100 %). Cada vez que conduces el coche con el mando a distancia, avanza tantos metros como la velocidad del coche y reduce el porcentaje de batería restante según su descarga.

Si la batería de un coche está por debajo de su porcentaje de descarga, ya no puedes conducir el coche.

Cada pista de carreras tiene su propia distancia. Los coches se prueban comprobando si pueden terminar la pista sin quedarse sin batería.

1. Crea un coche teledirigido

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

  • battery
  • batteryDrain
  • speed
  • distance

Permite crear un coche teledirigido definiendo una función NewCar que recibe la velocidad del coche en metros y el porcentaje de descarga de la batería como sus dos parámetros (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 struct llamado Track con el campo distance de tipo entero. Permite crear una pista de carreras definiendo una función NewTrack que recibe la distancia de la pista en metros como su único parámetro (que es de tipo int):

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

3. Conduce el coche

Implementa la función Drive que actualiza el número de metros recorridos según la velocidad del coche y reduce la batería según su descarga. Si no hay batería suficiente para conducir una vez más, el coche 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 coche teledirigido puede terminar una carrera

Para terminar una carrera, un coche debe ser capaz de recorrer la distancia de la carrera. Esto significa no agotar su batería antes de cruzar la línea de meta. Implementa la función CanFinish que recibe una instancia de Car y otra de Track como parámetros y devuelve true si el coche puede terminar la carrera; en caso contrario, devuelve false.

Supón que actualmente estás en la línea de salida de la carrera y arrancas el motor del coche para la carrera. Ten en cuenta que es posible que la batería del coche no esté necesariamente completamente cargada al comenzar 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 pestaña nueva
Go Exercism

¿Listo para empezar Necesidad de velocidad?

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