package main import "fmt" type calcFunc func(a, b int) int func compute(calc calcFunc, init int, a ...int) (result int) { result = init for _, n := range a { result = calc(result, n) } return } func selectCalcFunc(calcOp rune) calcFunc { return func(a, b int) int { switch calcOp { case '+': return a + b case '*': return a * b case '-': return a - b default: panic("Illegal operation") } } } func main() { fmt.Println(compute(selectCalcFunc('+'), 0, 1, 2, 3)) fmt.Println(compute(selectCalcFunc('-'), 0, 1, 2, 3)) fmt.Println(compute(selectCalcFunc('*'), 1, 1, 2, 3)) fmt.Println(compute(selectCalcFunc('?'), 1, 1, 2, 3)) }