Desafio Go

Funções como valores e variádicas: pipeline

Enunciado

Implemente uma função pipeline que recebe um valor inteiro, uma função de transformação func(int) int e uma lista variádica de outras funções de transformação. Ela deve aplicar a primeira função e, em seguida, cada uma das funções variádicas na ordem, retornando o resultado final. No main, crie dobro e maisUm e chame pipeline(3, dobro, maisUm, dobro); imprima o resultado no formato resultado=14.

Requisitos

  • A função pipeline deve ter a assinatura func pipeline(valor int, primeira func(int) int, resto ...func(int) int) int.
  • Deve aplicar primeira e depois cada função de resto em sequência.
  • As funções dobro e maisUm devem ser definidas como variáveis ou funções nomeadas no main.
  • A saída deve ser exatamente resultado=14.

Código inicial

package main

import "fmt"

// pipeline aplica uma sequência de funções a um valor.
func pipeline(valor int, primeira func(int) int, resto ...func(int) int) int {
	// implemente
}

func main() {
	// defina dobro e maisUm, chame pipeline e imprima
}

Saída esperada

resultado=14
Ver dica

Comece aplicando primeira ao valor. Depois, percorra resto com um for e vá atualizando o valor com v = f(v).

Mostrar solução
package main

import "fmt"

// pipeline aplica uma sequência de funções a um valor.
func pipeline(valor int, primeira func(int) int, resto ...func(int) int) int {
	resultado := primeira(valor)
	for _, f := range resto {
		resultado = f(resultado)
	}
	return resultado
}

func main() {
	dobro := func(x int) int { return x * 2 }
	maisUm := func(x int) int { return x + 1 }

	resultado := pipeline(3, dobro, maisUm, dobro)
	fmt.Printf("resultado=%d\n", resultado)
}

Passo a passo

  1. A assinatura de pipeline recebe valor int, primeira func(int) int e resto ...func(int) int.
  2. Aplicamos a primeira função: resultado := primeira(valor).
  3. O laço for _, f := range resto percorre as funções variádicas na ordem em que foram passadas.
  4. A cada iteração, atualizamos resultado com f(resultado), encadeando as transformações.
  5. Retornamos o resultado final.
  6. No main, definimos dobro e maisUm como funções anônimas atribuídas a variáveis.
  7. Chamamos pipeline(3, dobro, maisUm, dobro): dobro(3)=6, maisUm(6)=7, dobro(7)=14.

Por que funciona

Funções são valores de primeira classe em Go: podem ser armazenadas em variáveis e passadas como argumentos. O parâmetro variádico resto ...func(int) int coleta zero ou mais funções em um slice. O laço aplica cada uma em sequência, permitindo compor transformações de forma flexível.

Erros comuns

  • Esquecer de aplicar a primeira função: se só percorrer resto, o valor inicial não é transformado pela primeira.
  • Ordem errada: aplicar resto antes de primeira muda o resultado. A ordem importa.
  • Tipo incompatível: passar uma função com assinatura diferente, como func(int) string, causa erro de compilação.
  • Modificar o slice de funções: não é necessário; apenas leia os valores.

Outra forma de resolver

Usar um slice único de funções e passar todas juntas:

func pipeline(valor int, funcs ...func(int) int) int {
	for _, f := range funcs {
		valor = f(valor)
	}
	return valor
}

É preferível quando não há necessidade de separar a primeira função das demais.

Saída esperada

resultado=14