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
pipelinedeve ter a assinaturafunc pipeline(valor int, primeira func(int) int, resto ...func(int) int) int. - Deve aplicar
primeirae depois cada função derestoem sequência. - As funções
dobroemaisUmdevem ser definidas como variáveis ou funções nomeadas nomain. - 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
- A assinatura de
pipelinerecebevalor int,primeira func(int) interesto ...func(int) int. - Aplicamos a primeira função:
resultado := primeira(valor). - O laço
for _, f := range restopercorre as funções variádicas na ordem em que foram passadas. - A cada iteração, atualizamos
resultadocomf(resultado), encadeando as transformações. - Retornamos o resultado final.
- No
main, definimosdobroemaisUmcomo funções anônimas atribuídas a variáveis. - 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 pelaprimeira. - Ordem errada: aplicar
restoantes deprimeiramuda 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