Files
bulma/flag/custom_value.go
T

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))
}