Re: [go-nuts] Append array to slice of slice behavior puzzles me

2018-11-21 Thread Sam Mortimer
On Wednesday, November 21, 2018 at 2:38:42 PM UTC-8, Sun Frank wrote:
>
> Perfect! Thank you so much for your answer and explanation, : )
>

It is, unfortunately, a very common "gotcha".  More discussion can be found 
here: https://github.com/golang/go/issues/20733

Cheers,
-Sam.


 

> Best Regards
>
> Mail : eliteg...@gmail.com 
> Mobile : 0422 118 452
> TechBlog : http://elitegoblin.github.io
> GitHub: http://github.com/eliteGoblin/
>
>
> andrey mirtchovski > 于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  (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 > > 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...@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.


Re: [go-nuts] Append array to slice of slice behavior puzzles me

2018-11-21 Thread Sun Frank
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  于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  (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  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.


Re: [go-nuts] Append array to slice of slice behavior puzzles me

2018-11-21 Thread andrey mirtchovski
this is a case of a variable being reused during a range loop.
essentially k[:] is optimized to something resembling  (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  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.


Re: [go-nuts] Append array to slice of slice behavior puzzles me

2018-11-21 Thread Miguel Angel Rivera Notararigo
Hi, just add  k := k  after the for-range line

-- 
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.


[go-nuts] Append array to slice of slice behavior puzzles me

2018-11-21 Thread Sun Frank
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.