60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
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))
|
|
}
|