Variadic functions accept any number of values for one parameter.

variadic parameter A parameter written with `...` accepts zero or more values.

Variadic Functions

bonus
variadic_functions.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func sum(values ...int) int {
	total := 0
	for _, value := range values {
		total += value
	}
	return total
}

func main() {
	var bonus = 5
	values := []int{2, 3, bonus}
	total := sum(values...)

	fmt.Println("values=", values)
	fmt.Println("total=", total)
}
package main

import "fmt"

func sum(values ...int) int {
	total := 0
	for _, value := range values {
		total += value
	}
	return total
}

func main() {
	var bonus = 0
	values := []int{2, 3, bonus}
	total := sum(values...)

	fmt.Println("values=", values)
	fmt.Println("total=", total)
}
package main

import "fmt"

func sum(values ...int) int {
	total := 0
	for _, value := range values {
		total += value
	}
	return total
}

func main() {
	var bonus = 10
	values := []int{2, 3, bonus}
	total := sum(values...)

	fmt.Println("values=", values)
	fmt.Println("total=", total)
}
  1. bonus ← 5, values ← []int{2, 3, 5}

    13func main() {14  var bonus→ 5 = 5 //@bonus=0, 1015  values→ []int{2, 3, 5} := []int{2, 3, bonus5}16  total := sum(values[]int{2, 3, 5}...)
  2. total ← 0

    5func sum(values[]int{2, 3, 5} ...int) int {6  total→ 0 := 07  for _, value := range values {
  3. total ← 2

    pass 1 of 3
    6total := 07for _, value2 := range values[]int{2, 3, 5} {8  total→ 2 += value29}
    All 3 passes — pass 1 is the card above
    passvaluetotal
    120 2
    232 5
    355 10
  4. return total

    9  }10  return total1011}
  5. total ← 10

    15  values := []int{2, 3, bonus}16  total→ 10 := sum(values[]int{2, 3, 5}...)1718  fmt.Println("values=", values[]int{2, 3, 5})19  fmt.Println("total=", total10)20}
    outputvalues= [2 3 5]
    total= 10
  1. bonus ← 0, values ← []int{2, 3, 0}

    13func main() {14  var bonus→ 0 = 015  values→ []int{2, 3, 0} := []int{2, 3, bonus0}16  total := sum(values[]int{2, 3, 0}...)
  2. total ← 0

    5func sum(values[]int{2, 3, 0} ...int) int {6  total→ 0 := 07  for _, value := range values {
  3. total ← 2

    pass 1 of 3
    6total := 07for _, value2 := range values[]int{2, 3, 0} {8  total→ 2 += value29}
    All 3 passes — pass 1 is the card above
    passvaluetotal
    120 2
    232 5
    305
  4. return total

    9  }10  return total511}
  5. total ← 5

    15  values := []int{2, 3, bonus}16  total→ 5 := sum(values[]int{2, 3, 0}...)1718  fmt.Println("values=", values[]int{2, 3, 0})19  fmt.Println("total=", total5)20}
    outputvalues= [2 3 0]
    total= 5
  1. bonus ← 10, values ← []int{2, 3, 10}

    13func main() {14  var bonus→ 10 = 1015  values→ []int{2, 3, 10} := []int{2, 3, bonus10}16  total := sum(values[]int{2, 3, 10}...)
  2. total ← 0

    5func sum(values[]int{2, 3, 10} ...int) int {6  total→ 0 := 07  for _, value := range values {
  3. total ← 2

    pass 1 of 3
    6total := 07for _, value2 := range values[]int{2, 3, 10} {8  total→ 2 += value29}
    All 3 passes — pass 1 is the card above
    passvaluetotal
    120 2
    232 5
    3105 15
  4. return total

    9  }10  return total1511}
  5. total ← 15

    15  values := []int{2, 3, bonus}16  total→ 15 := sum(values[]int{2, 3, 10}...)1718  fmt.Println("values=", values[]int{2, 3, 10})19  fmt.Println("total=", total15)20}
    outputvalues= [2 3 10]
    total= 15