Issue
I have this code:
// The input param is A := []int{3, 4, 5, 3, 7}
func someFunc(A []int) int {
...
ways := 0
i := 0
for i < len(A) {
if i+1 == len(A) || i == len(A) {
fmt.Println("break")
break
}
tempA := A // copy the slice by value
fmt.Println("A: ", A)
fmt.Println("tempA: ", A)
fmt.Println()
newArr = remove(tempA, i)
if isAesthetic(newArr) {
ways++
}
i++
}
...
}
func remove(slice []int, s int) []int {
return append(slice[:s], slice[s+1:]...)
}
Cosole output:
A: [3 4 5 3 7]
tempA: [3 4 5 3 7]
A: [4 5 3 7 7]
tempA: [4 5 3 7 7]
A: [4 3 7 7 7]
tempA: [4 3 7 7 7]
A: [4 3 7 7 7]
tempA: [4 3 7 7 7]
The variable A
also changes while I just copy it by value into tempA
. And also it is append()
function, why the slice that used to append tempA
also changed?
Solution
You need to utilize the copy
function:
package main
import "fmt"
func main() {
a := []int{3, 4, 5, 3, 7}
// bad
b := a
// good
c := make([]int, len(a))
copy(c, a)
// CHANGES b and a!
b = append(b[:1], b[2:]...)
// c stays the same, a is messed up
// [3 5 3 7 7] [3 5 3 7] [3 4 5 3 7]
fmt.Println(a, b, c)
}
https://golang.org/pkg/builtin#copy
Answered By - Zombo Answer Checked By - Willingham (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.