16-slices/questions/4-backing-array.md
1: A slice value doesn't store any elements. It's just a simple data structure.
2: There is not a global backing array.
3: A backing array can be shared among slices. It may not be specific to a slice.
4: Yep! A slice stores its elements in a backing that the slice references (or points to).
// example:
s := []string{"I'm", "a", "slice"}
s[2:] // <-- slicing
3: Yes! Slicing returns a new slice that references to some segment of the same backing array.
2: Yes. A slice's backing array is contiguous in memory. So, accessing an element of a slice is very fast. Go can look at a specific memory location to find an element's value very fast.
arr := [...]int{1, 2, 3}
slice1 := arr[2:3]
slice2 := slice1[:1]
1: Yes! When a slice is created by slicing an array, that array becomes the backing array of that slice.
4: Nope. That only happens when a slice doesn't being created from an array.
arr := [...]int{1, 2, 3}
slice := []int{1, 2, 3}
1: Nope, the slice hasn't created by slicing an array.
4: Yes! A slice literal always creates a new hidden array.
slice1 := []int{1, 2, 3}
slice2 := []int{1, 2, 3}
2: That's right. A slice literal always creates a new backing array.
slice1 := []int{1, 2, 3}
slice2 := []int{1, 2, 3}
slice3 := slice1[:]
slice4 := slice2[:]
2: Yep! A slice that is being created by slicing shares the same backing with the sliced slice. Here, slice3 is being created from slice1. That is also true for slice2 and slice4.
nums := []int{9, 7, 5, 3, 1}
nums = nums[:1]
fmt.Println(nums) // prints: [9]
arr := [...]int{9, 7, 5, 3, 1}
nums := arr[2:]
nums2 := nums[1:]
arr[2]++
nums[1] -= arr[4] - 4
nums2[1] += 5
fmt.Println(nums)
2: Yes! Because the backing array of
numsandnums2is the same:arr. See the explanation here: https://play.golang.org/p/xTy0W0S_8PN