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.