package arrays func Sum(a []int) int { sum := 0 //aternatively // for i := 0; i < 5; i++ { // sum += a[i] // } // OR // for i := range a { // sum += a[i] // } // OR for _, v := range a { sum += v } return sum } // The ... in the method signature means it's variadic function // meaning it takes a variable number of arguments // SumAll func SumAll(numbersToSum ...[]int) []int { // lengthOfNumbers := len(numbersToSum) //There's a new way to create a slice. make allows you to create a slice with a starting capacity of the len of the numbersToSum we need to work through. // sums := make([]int, lengthOfNumbers) // for i, numbers := range numbersToSum { // sums[i] = Sum(numbers) // } // Using the append method you do not have to worry about capacity and index errors // append will create a new slice with greater capacity and the new value added to it. // The is a different between len() and capacity() capacity is the allocated size, and there // is an algorithm used by append to determine when it needs to change. var sums []int for _, numbers := range numbersToSum { sums = append(sums, Sum(numbers)) } return sums } func SumAllTails(numbersToSum ...[]int) []int { var sums []int for _, numbers := range numbersToSum { if len(numbers) == 0 { sums = append(sums, 0) } else { tails := numbers[1:] sums = append(sums, Sum(tails)) } } return sums }