From 9283d9a1507f931832e7875228ceea2d3007fc87 Mon Sep 17 00:00:00 2001 From: wuyangfan Date: Wed, 27 May 2026 00:16:04 +0800 Subject: [PATCH] fix: stop GetIP erroring when the IP flag has a nil default When an IP flag defaults to nil, Value.String() round-trips as "" and ipConv rejected it. Treat empty and "" as a nil net.IP, matching Set("") behavior. Fixes #478. Fixes #351. Co-authored-by: Cursor --- ip.go | 3 +++ ip_nil_default_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 ip_nil_default_test.go diff --git a/ip.go b/ip.go index 06b8bcb5..046f48b3 100644 --- a/ip.go +++ b/ip.go @@ -32,6 +32,9 @@ func (i *ipValue) Type() string { } func ipConv(sval string) (interface{}, error) { + if sval == "" || sval == "" { + return net.IP(nil), nil + } ip := net.ParseIP(sval) if ip != nil { return ip, nil diff --git a/ip_nil_default_test.go b/ip_nil_default_test.go new file mode 100644 index 00000000..035f14c6 --- /dev/null +++ b/ip_nil_default_test.go @@ -0,0 +1,35 @@ +package pflag + +import ( + "net" + "testing" +) + +func TestGetIPNilDefault(t *testing.T) { + t.Run("IP", func(t *testing.T) { + f := NewFlagSet("test", ContinueOnError) + f.IP("ip", nil, "IP address") + + ip, err := f.GetIP("ip") + if err != nil { + t.Fatalf("GetIP returned error: %v", err) + } + if ip != nil { + t.Fatalf("expected nil IP, got %v", ip) + } + }) + + t.Run("IPVar", func(t *testing.T) { + f := NewFlagSet("test", ContinueOnError) + var ip net.IP + f.IPVar(&ip, "ip", nil, "IP address") + + got, err := f.GetIP("ip") + if err != nil { + t.Fatalf("GetIP returned error: %v", err) + } + if got != nil { + t.Fatalf("expected nil IP, got %v", got) + } + }) +}