package main import ( "flag" "fmt" "os" ) // PortValue 自定义端口类型,实现flag.Value接口 type PortValue int func (p *PortValue) Set(s string) error { var port int _, err := fmt.Sscanf(s, "%d", &port) if err != nil || port < 1 || port > 65535 { return fmt.Errorf("非法端口,必须为1-65535整数") } *p = PortValue(port) return nil } func (p *PortValue) String() string { return fmt.Sprintf("%d", *p) } // EnvValue 枚举环境校验类型 type EnvValue string func (e *EnvValue) Set(s string) error { if s != "dev" && s != "prod" { return fmt.Errorf("仅支持 dev/prod 环境") } *e = EnvValue(s) return nil } func (e *EnvValue) String() string { return string(*e) } func main() { var port PortValue var env EnvValue flag.Var(&port, "port", "服务端口 1-65535") flag.Var(&env, "env", "运行环境 dev/prod") config := flag.String("config", "", "配置文件路径(必填)") flag.Parse() // 后置非空校验 if *config == "" { fmt.Println("错误:config 参数不能为空") flag.Usage() os.Exit(1) } fmt.Printf("环境:%s,端口:%d,配置:%s\n", env, port, *config) }