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.

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 intcomparte 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
returnsolo 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.