diff --git a/exercise_0302/go.mod b/exercise_0302/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..4444524d0c3af71614484eaa65edf54e657a6f4d
--- /dev/null
+++ b/exercise_0302/go.mod
@@ -0,0 +1,3 @@
+module gitlab.reutlingen-university.de/go-exercises/go-starter/exercise_0302
+
+go 1.20
diff --git a/exercise_0302/main.go b/exercise_0302/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..58762e066a8afef728510fcf89dcd7dba9c247ea
--- /dev/null
+++ b/exercise_0302/main.go
@@ -0,0 +1,35 @@
+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))
+}