Médio Go
Retornos nomeados: estatísticas
Enunciado
Crie uma função estatisticas que recebe uma lista variádica de números float64 e retorna a soma, a média e a quantidade de elementos, usando retornos nomeados. Se a lista estiver vazia, retorne soma 0, média 0 e quantidade 0. No main, chame com 1, 2, 3, 4 e imprima soma=10.00 media=2.50 n=4.
Requisitos
- A função deve se chamar
estatisticase ser variádica (...float64). - Deve usar retornos nomeados na assinatura.
- Deve tratar o caso de lista vazia sem causar divisão por zero.
- A saída deve ser exatamente
soma=10.00 media=2.50 n=4.
Código inicial
package main
import "fmt"
// estatisticas retorna soma, média e quantidade.
func estatisticas(nums ...float64) (soma, media float64, n int) {
// implemente
}
func main() {
// chame e imprima
}
Saída esperada
soma=10.00 media=2.50 n=4
Ver dica
Use n = len(nums) e um laço for _, v := range nums. Para a média, verifique se n > 0 antes de dividir.
Mostrar solução
package main
import "fmt"
// estatisticas retorna soma, média e quantidade.
func estatisticas(nums ...float64) (soma, media float64, n int) {
n = len(nums)
for _, v := range nums {
soma += v
}
if n > 0 {
media = soma / float64(n)
}
return
}
func main() {
soma, media, n := estatisticas(1, 2, 3, 4)
fmt.Printf("soma=%.2f media=%.2f n=%d\n", soma, media, n)
}
Passo a passo
- A assinatura declara
(soma, media float64, n int): três retornos nomeados. n = len(nums)armazena a quantidade de elementos recebidos.- O laço
for _, v := range numsacumula os valores emsoma. - Se
n > 0, calculamosmedia = soma / float64(n). Caso contrário,mediapermanece 0. returnsem argumentos devolve os valores atuais das variáveis nomeadas.- No
main, capturamos os três valores e imprimimos com%.2fpara duas casas decimais.
Por que funciona
Os retornos nomeados são inicializados com o zero value do tipo (0 para números). Assim, no caso vazio, soma e media já são 0 e n é 0. O return sem argumentos é permitido apenas quando há retornos nomeados. A função variádica aceita qualquer quantidade de float64, inclusive zero.
Erros comuns
- Dividir por zero:
media = soma / float64(n)sem verificarn > 0causaNaN(não erro de compilação, mas resultado inválido). - Esquecer de converter
n:soma / nnão compila, poissomaéfloat64enéint. - Usar
return soma, media, n: funciona, mas perde a vantagem dos retornos nomeados. Oreturnvazio é mais idiomático aqui.
Outra forma de resolver
Sem retornos nomeados:
func estatisticas(nums ...float64) (float64, float64, int) {
soma := 0.0
for _, v := range nums { soma += v }
n := len(nums)
if n == 0 { return 0, 0, 0 }
return soma, soma / float64(n), n
}
É preferível quando a função é curta e os nomes não agregam muita clareza.
Saída esperada
soma=10.00 media=2.50 n=4