Go

What will be the output of the following block of code?:

package main

import (
	"fmt"
)

func mod1(a []int) {
	for i := range a {
		a[i] = 5
	}

	fmt.Println("1:", a)
}

func mod2(a []int) {
	a = append(a, 125) // !

	for i := range a {
		a[i] = 5
	}

	fmt.Println("2:", a)
}

func main() {
	s1 := []int{1, 2, 3, 4}
	mod1(s1)
	fmt.Println("1:", s1)

	s2 := []int{1, 2, 3, 4}
	mod2(s2)
	fmt.Println("2:", s2)
}

Difficulty: unrated

Source: bregman-arie/devops-exercises by Arie Bregman

Answer

Output:

1 [5 5 5 5]

1 [5 5 5 5]

2 [5 5 5 5 5]

2 [1 2 3 4]

In mod1 a is link, and when we're using a[i], we're changing s1 value to. But in mod2, append creates new slice, and we're changing only a value, not s2.

Aritcle about arrays, Blog post about append