On Tue, Sep 10, 2019 at 1:13 PM Tong Sun <
sunto...@gmail.com> wrote:
>
> I'm experiencing a weird problem with my program and finally nail it down to what exactly went wrong, so that I can write a minimum program to duplicate it. See the following program:
>
> package main
>
>
> import (
> "fmt"
> )
>
>
> type Vertex struct {
> X int
> Y int
> }
>
>
> func main() {
> vs := []Vertex{
> Vertex{1, 2}, // has type Vertex
> Vertex{X: 3}, // Y:0 is implicit
> Vertex{}, // X:0 and Y:0
> }
>
>
> fmt.Printf("Vertex Slice %+v\n", vs)
> var vp *Vertex = nil
> for _, v := range vs {
> if v.X == 3 {
> vp = &v
> }
> }
> fmt.Printf("Found: %+v\n", vp)
> }
>
>
>
https://play.golang.org/p/R645C5plojx
>
> I was expecting that the found Vertex is "v.X == 3", however the result is not.
Because you're keeping a pointer to the loop variable. v continues
changing after you store the address of it, so you get the latest
value of v. Instead, save a copy of v, or break the loop as soon as
what you're looking for is found:
if v.x==3 {
t:=v
vp=&t
> --
> 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.
> To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/143205c1-2c86-4404-94d2-4182a6285e21%40googlegroups.com.