DMarlon Studio

Lección 12 · 12 de 20

Funciones y varios resultados · Go

Escriba funciones en Go con parámetros y tipo de resultado, devuelva varios valores a la vez y use resultados con nombre.

Go · Funciones y varios resultados en DMarlon Studio: el código del ejemplo y su salida en la terminal

Una función se declara con func, su nombre, sus parámetros con su tipo y, al final, el tipo de lo que devuelve: func vat(price float64) float64. return entrega el resultado: vat(40) da 8.40 de IVA. Si el cuerpo es corto, puede ir en una sola línea.

En Go una función puede devolver varios valores. share devuelve dos int, lo que toca a cada niño y lo que sobra: return sweets / children, sweets % children. Cuando dos parámetros seguidos son del mismo tipo, basta con escribirlo una vez: sweets, children int.

Quien llama recoge los dos resultados a la vez: each, left := share(17, 5) da 3 y 2. Hay que recoger todos o ninguno, así que si solo interesa uno, el otro se descarta con _, como en _, rest := share(100, 7).

Los resultados con nombre, como (low, high int), son variables que empiezan en su valor cero; la función las rellena y un return sin nada más las devuelve. lowHigh recibe un slice, empieza por el primer número y recorre el resto quedándose con el menor y el mayor: 9 y 31.

Código · main.go

package mainimport "fmt"// Parameters go with their types; the result type comes last.func vat(price float64) float64 { return price * 0.21 }// A function can return several values.func share(sweets, children int) (int, int) {	return sweets / children, sweets % children}// Named results start at zero; a bare return sends them back.func lowHigh(numbers []int) (low, high int) {	low, high = numbers[0], numbers[0]	for i := 1; i < len(numbers); i++ {		if numbers[i] < low {			low = numbers[i]		} else if numbers[i] > high {			high = numbers[i]		}	}	return}func main() {	fmt.Printf("VAT on 40 euros: %.2f\n", vat(40))	each, left := share(17, 5)	fmt.Println("Sweets each:", each, "left over:", left)	_, rest := share(100, 7) // _ ignores a result	fmt.Println("Left over from 100 among 7:", rest)	low, high := lowHigh([]int{18, 25, 9, 31, 22})	fmt.Println("Lowest:", low, "highest:", high)}

Salida · go run main.go

VAT on 40 euros: 8.40
Sweets each: 3 left over: 2
Left over from 100 among 7: 2
Lowest: 9 highest: 31

Para recordar

  • func nombre(p tipo) resultado { } declara una función.
  • a, b int comparte el tipo entre parámetros seguidos.
  • Una función puede devolver varios valores: return x, y.
  • _ descarta un resultado que no hace falta.
  • Con resultados con nombre, un return solo los devuelve.

Ejercicio

Escriba func average(numbers []int) (float64, int), que devuelva la media y cuántos números hay, y úsela con las mismas notas de lowHigh.