Perfect! Thank you so much for your answer and explanation, : ) Best Regards
Mail : elitegobli...@gmail.com Mobile : 0422 118 452 TechBlog : http://elitegoblin.github.io GitHub : http://github.com/eliteGoblin/ andrey mirtchovski <mirtchov...@gmail.com> 于2018年11月22日周四 上午9:22写道: > this is a case of a variable being reused during a range loop. > essentially k[:] is optimized to something resembling &k (a pointer to > the memory location of the backing array) which is appended as such to > the [][]int variable. the next iteration it is the same variable in > memory, however it's pointing to a different backing array. the > address of that variable is added to [][]int again. in order to avoid > this you will have to redeclare k inside the loop to ensure a new > backing array is used when adding to the slice of slices. > > maybe the easiest way to explain this is to point you towards this > blog post: https://blog.golang.org/go-slices-usage-and-internals and > to note that the for loop in your example expands/unrolls to something > like this, which breaks what you considered to "work" in your original > example: > > a1 := [3]int{1, 2, 3} > a2 := [3]int{4, 5, 6} > a3 := [3]int{7, 8, 9} > > s := make([][]int, 0) > a := a1 > s = append(s, a[:]) > a = a2 > s = append(s, a[:]) > a = a3 > s = append(s, a[:]) > > fmt.Println(s) > On Wed, Nov 21, 2018 at 2:41 PM Sun Frank <elitegobli...@gmail.com> wrote: > > > > Hi guys, I came across some code that surprised me, but I could not > figured out why it behave like this, > > > > s := make([][]int, 0) > > a1 := [3]int{1, 2, 3} > > a2 := [3]int{4, 5, 6} > > s = append(s, a1[:]) > > s = append(s, a2[:]) > > fmt.Println(s) > > > > mp := make(map[[3]int]bool) > > mp[[3]int{1, 2, 3}] = true > > mp[[3]int{4, 5, 6}] = true > > mp[[3]int{7, 8, 9}] = true > > res := make([][]int, 0) > > for k := range mp { > > fmt.Printf("key is %+v\n", k[:]) > > res = append(res, k[:]) > > fmt.Printf("after append: %+v\n", res) > > } > > > > or on playground > > > > the output is: > > > > [[1 2 3] [4 5 6]] // this is as expected > > key is [1 2 3] > > after append: [[1 2 3]] > > key is [4 5 6] > > after append: [[4 5 6] [4 5 6]] // Why it get this not [[1 2 3] [4 5 6]] > > key is [7 8 9] > > after append: [[7 8 9] [7 8 9] [7 8 9]] // why even this? > > > > > > any thoughts? > > > > > > Thanks! > > > > > > > > -- > > You received this message because you are subscribed to the Google > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to golang-nuts+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.