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 estatisticas e 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

  1. A assinatura declara (soma, media float64, n int): três retornos nomeados.
  2. n = len(nums) armazena a quantidade de elementos recebidos.
  3. O laço for _, v := range nums acumula os valores em soma.
  4. Se n > 0, calculamos media = soma / float64(n). Caso contrário, media permanece 0.
  5. return sem argumentos devolve os valores atuais das variáveis nomeadas.
  6. No main, capturamos os três valores e imprimimos com %.2f para 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 verificar n > 0 causa NaN (não erro de compilação, mas resultado inválido).
  • Esquecer de converter n: soma / n não compila, pois soma é float64 e n é int.
  • Usar return soma, media, n: funciona, mas perde a vantagem dos retornos nomeados. O return vazio é 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