package main import ( "flag" "fmt" "strings" ) // PortRange 自定义端口范围类型,支持 min-max 格式 type PortRange struct { Min int Max int } // Set 实现Value接口,完成参数解析和合法性校验 func (p *PortRange) Set(s string) error { parts := strings.Split(s, "-") if len(parts) != 2 { return fmt.Errorf("格式错误,端口范围格式必须为 minV-max") } var minV, maxV int _, err1 := fmt.Sscanf(parts[0], "%d", &minV) _, err2 := fmt.Sscanf(parts[1], "%d", &maxV) if err1 != nil || err2 != nil { return fmt.Errorf("端口必须为整数") } if minV < 1 || minV > 65535 || maxV < 1 || maxV > 65535 || minV > maxV { return fmt.Errorf("端口范围必须在1-65535之间,且min <= max") } p.Min = minV p.Max = maxV return nil } // String 实现Value接口,定义默认值与字符串展示 func (p *PortRange) String() string { if p.Min == 0 && p.Max == 0 { return "1-65535" } return fmt.Sprintf("%d-%d", p.Min, p.Max) } // Get 实现Getter接口,返回原始类型,支持类型断言 func (p *PortRange) Get() any { return *p } func main() { var portRange PortRange flag.Var(&portRange, "port-range", "端口范围,格式:min-max") flag.Parse() fmt.Printf("有效端口范围:[%d, %d]\n", portRange.Min, portRange.Max) fmt.Printf("类型安全取值:%#v\n", portRange.Get().(PortRange)) }