Chrisna
Chrisna

Reputation: 55

Difference between copy and assign slice golang

Hi everyone I hope you guys doing well, I was reading the copy build-in function, and I was wondering what was the difference between straight assign value from arr to tmp and copy the value from arr to tmp? since both will have the same result both value and cap and length of arr slice. here's the golang playground.

package main

import "fmt"

func main() {
    arr := []int{1, 2, 3}
    tmp := make([]int, len(arr))
    copy(tmp, arr)
    fmt.Println(tmp)
    fmt.Println(arr)
    fmt.Println(cap(tmp))
    fmt.Println(len(tmp))

    tmp2 := arr
    fmt.Println(tmp2) 
    fmt.Println(cap(tmp2))
    fmt.Println(len(tmp2))
}

the result is,

[1 2 3]
[1 2 3]
3
3
[1 2 3]
3
3

if they had a difference what will it be and can you explain it with an example, please and thank you for your time and consideration :)

Upvotes: 0

Views: 1600

Answers (2)

reoxey
reoxey

Reputation: 704

As Muffin already answered, slice data structure is a pointer to an array. So if you assign to a new variable, it is still a pointer to the same array. That's why, any changes you make to the slice is reflected back to the array it represents.

Also, a new slice is initialised with a small capacity (array length). Once it is fully occupied, it has to create a new array and copy all its content from the old to new array.

Upvotes: 0

Thundercat
Thundercat

Reputation: 120941

The backing array of tmp is a copy of the the backing array from arr.

The slices tmp2 and arr share the same backing array.

See this code:

arr := []int{1, 2, 3}
tmp := make([]int, len(arr))
copy(tmp, arr)

tmp2 := arr

arr[0] = 22
fmt.Println(arr)  // prints [22 2 3]
fmt.Println(tmp)  // prints [1 2 3]
fmt.Println(tmp2) // prints [22 2 3]

Notice how changing an element in arr also changed in element in tmp2, but not tmp.

Upvotes: 4

Related Questions