On Thu, Sep 17, 2020 at 5:04 PM Manfred Touron <m...@42.am> wrote:
>
> I think that I discovered a bug in the stdlib flag package:
>
>     sharedFlag := "init-value"
>     fooFs := flag.NewFlagSet("foo", flag.ContinueOnError)
>     barFs := flag.NewFlagSet("bar", flag.ContinueOnError)
>     fooFs.StringVar(&sharedFlag, "baz", "foo-default", "testing")
>     barFs.StringVar(&sharedFlag, "baz", "bar-default", "testing")
>     _ = fooFs.Parse([]string{""}) // no error
>     fmt.Println(*sharedFlag) // bar-default, instead of foo-default
>
> To quote @peterbourgon on this issue:
>
> > Haha! This is a bug (?) with stdlib flag.FlagSet.
> > The default value provided to e.g. fs.StringVar isn't kept as metadata 
> > associated with the flag in the corresponding flagset, but is rather 
> > assigned to the associated variable. And that assignment happens at 
> > declaration time, when you call fs.StringVar, and not when you call 
> > fs.Parse. So the default value you see in any flag set will be the default 
> > value provided to whichever StringVar declaration happens to occur last — 
> > in your test, it's this one.
> > This sucks.
> > I think the only fix here would be, somehow, avoiding assigning a default 
> > value in the declaration, and populating it later. Or defining a separate 
> > e.g. DeferredFlagVar type that encapsulated this behavior? I don't know 
> > offhand what's best. Ugh.
>
> I never contributed to the go repo yet, so I prefer to ask here your opinion 
> about this strange behavior, what you suggest in term of fix that does not 
> require to touch the stdlib, and if you think that I need to issue a bug on 
> the go repo and try to contribute a fix?

What you say is true and I can see how it would be surprising but I
don't personally consider this to be a bug.  It's a design decision.
Perhaps it should be documented more clearly: don't use the same
variable for more than one XXXVar calls.

Ian

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcW67XjKraQJxuCDsSWMELFkOvdE--VGGDrFH0wDAKAc7A%40mail.gmail.com.

Reply via email to