{"id":1533,"date":"2024-10-14T20:22:25","date_gmt":"2024-10-14T12:22:25","guid":{"rendered":"https:\/\/www.madbull.site\/?p=1533"},"modified":"2025-10-13T18:21:35","modified_gmt":"2025-10-13T10:21:35","slug":"golang%e4%bd%bf%e7%94%a8flag%e6%b7%bb%e5%8a%a0%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%8f%82%e6%95%b0","status":"publish","type":"post","link":"https:\/\/www.madbull.site\/?p=1533","title":{"rendered":"golang\u4f7f\u7528flag\u6dfb\u52a0\u547d\u4ee4\u884c\u53c2\u6570"},"content":{"rendered":"\n<p class=\"has-large-font-size\"><strong>\u4ee3\u7801\uff1a<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ targs.go\npackage main\n\nimport (\n    \"log\"\n    \"flag\"\n    \"strings\"\n)\n\n\/\/ \u5b9a\u4e49\u53ef\u91cd\u590d\u53c2\u6570\ntype strSlice &#91;]string\n\nfunc (s *strSlice) Set(value string) error {\n    *s = append(*s, value)\n    return nil\n}\n\nfunc (s strSlice) String() string {\n    return strings.Join(s, \",\")\n}\n\nfunc main() {\n    \/\/ \u58f0\u660e\u53d8\u91cf\n    var ( \n        name = flag.String(\"name\", \"Lilei\", \"Give your name\")\n        age = flag.Int(\"age\", 28, \"Give your age\")\n        iscold = flag.Bool(\"iscold\", false, \"Are you cold\")\n        arglst strSlice\n    )\n    \/\/ \u89e3\u6790 arg \u683c\u5f0f\u7684\u53c2\u6570\n    flag.Var(&amp;arglst, \"arg\", \"some other arg\")\n    \/\/ \u89e3\u6790\u53c2\u6570\n    flag.Parse()\n\n    \/\/ \u8f93\u51fa\u6d4b\u8bd5\n    log.Printf(\"name: &#91;%s]\", *name)\n    log.Printf(\"age: &#91;%d]\", *age)\n    log.Printf(\"iscold: &#91;%t]\", *iscold)\n    log.Printf(\"arglst: &#91;%v]\", arglst)\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u6d4b\u8bd5\uff1a<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"739\" height=\"446\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-19.png\" alt=\"\" class=\"wp-image-1842\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-19.png 739w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-19-300x181.png 300w\" sizes=\"auto, (max-width: 739px) 100vw, 739px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u6269\u5c55\uff1a<\/strong><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf1f \u63a5\u53e3 <code>flag.Value<\/code><\/h2>\n\n\n\n<p><strong><code>flag.Var<\/code> \u7528\u6765\u6ce8\u518c\u4e00\u4e2a\u201c\u53ef\u53d8\u201d\u7684\u547d\u4ee4\u884c\u6807\u5fd7\uff08flag\uff09\uff0c\u5b83\u5141\u8bb8\u4f60\u4f7f\u7528\u81ea\u5b9a\u4e49\u6570\u636e\u7c7b\u578b\uff08\u6bd4\u5982 slice\u3001map \u7b49\uff09\uff0c\u53ea\u8981\u8fd9\u4e2a\u7c7b\u578b\u5b9e\u73b0\u4e86 <code>flag.Value<\/code> \u63a5\u53e3\u3002<\/strong><\/p>\n\n\n\n<p>Go \u7684\u6807\u51c6\u5e93 <code>flag.Value<\/code> \u63a5\u53e3\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Value interface {\n    String() string\n    Set(string) error\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td><code>Set(string)<\/code><\/td><td>\u5f53\u547d\u4ee4\u884c\u4f20\u5165 <code>--xxx=value<\/code> \u65f6\uff0cViper \u8c03\u7528\u8fd9\u4e2a\u65b9\u6cd5\u6765\u8bbe\u7f6e\u503c<\/td><\/tr><tr><td><code>String()<\/code><\/td><td>\u7528\u4e8e\u751f\u6210\u5e2e\u52a9\u4fe1\u606f\uff08<code>--help<\/code> \u8f93\u51fa\uff09<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>var cmdargs strSlice\nflag.Var(&amp;cmdargs, \"cmdarg\", \"cmd\u6307\u4ee4\u9700\u8981\u7684\u53c2\u6570\")  \/\/ \u6765\u83b7\u53d6 --cmdarg \u53c2\u6570\u63d0\u4f9b\u7684\u6570\u636e<\/code><\/pre>\n\n\n\n<p><strong>flag.Int flag.Float flag.String flag.Bool \u8fd4\u56de\u7684\u5168\u90e8\u662f\u6307\u9488<\/strong><br><strong>flag.IntVar flag.FloatVar flag.StringVar flag.BoolVar \u4f20\u5165\u53d8\u91cf\u5730\u5740\u6765\u83b7\u53d6\u503c\u3002<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">demo\uff1a<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"flag\"\n    \"fmt\"\n    \"net\"\n    \"strings\"\n    \"time\"\n)\n\n\/\/ \u81ea\u5b9a\u4e49\u7c7b\u578b\u5b9a\u4e49\ntype stringSlice &#91;]string\n\nfunc (s *stringSlice) Set(value string) error {\n    *s = append(*s, value)\n    return nil\n}\n\nfunc (s *stringSlice) String() string {\n    return fmt.Sprintf(\"%v\", &#91;]string(*s))\n}\n\ntype LogLevel string\n\nconst (\n    Debug LogLevel = \"debug\"\n    Info  LogLevel = \"info\"\n    Warn  LogLevel = \"warn\" \n    Error LogLevel = \"error\"\n)\n\nfunc (l *LogLevel) Set(value string) error {\n    level := LogLevel(value)\n    switch level {\n    case Debug, Info, Warn, Error:\n        *l = level\n        return nil\n    default:\n        return fmt.Errorf(\"\u65e0\u6548\u7684\u65e5\u5fd7\u7ea7\u522b: %s\", value)\n    }\n}\n\nfunc (l *LogLevel) String() string {\n    return string(*l)\n}\n\ntype IPList &#91;]net.IP\n\nfunc (ips *IPList) Set(value string) error {\n    ip := net.ParseIP(value)\n    if ip == nil {\n        return fmt.Errorf(\"\u65e0\u6548\u7684IP\u5730\u5740: %s\", value)\n    }\n    *ips = append(*ips, ip)\n    return nil\n}\n\nfunc (ips *IPList) String() string {\n    ipsStr := make(&#91;]string, len(*ips))\n    for i, ip := range *ips {\n        ipsStr&#91;i] = ip.String()\n    }\n    return strings.Join(ipsStr, \", \")\n}\n\nfunc main() {\n    \/\/ \u5185\u7f6e\u7c7b\u578b\u53c2\u6570\n    var (\n        \/\/ \u5e03\u5c14\u7c7b\u578b\n        debug = flag.Bool(\"debug\", false, \"\u542f\u7528\u8c03\u8bd5\u6a21\u5f0f\")\n        verbose = flag.Bool(\"verbose\", false, \"\u8be6\u7ec6\u8f93\u51fa\")\n        \n        \/\/ \u6574\u6570\u7c7b\u578b - \u4f7f\u7528 Int \u4ee3\u66ff Int32\n        port = flag.Int(\"port\", 8080, \"\u670d\u52a1\u7aef\u53e3\")\n        priority = flag.Int(\"priority\", 1, \"\u4f18\u5148\u7ea7\")  \/\/ \u6539\u4e3a Int\n        maxSize = flag.Int64(\"max-size\", 1024, \"\u6700\u5927\u5c3a\u5bf8(MB)\")\n        \n        \/\/ \u6d6e\u70b9\u6570\u7c7b\u578b - \u4f7f\u7528 Float64 \u4ee3\u66ff Float32\n        rate = flag.Float64(\"rate\", 0.5, \"\u5904\u7406\u901f\u7387\")\n        temperature = flag.Float64(\"temp\", 25.5, \"\u6e29\u5ea6(\u2103)\")  \/\/ \u6539\u4e3a Float64\n        \n        \/\/ \u5b57\u7b26\u4e32\u7c7b\u578b\n        name = flag.String(\"name\", \"World\", \"\u59d3\u540d\")\n        config = flag.String(\"config\", \"config.json\", \"\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\")\n        \n        \/\/ \u65f6\u95f4\u7c7b\u578b\n        interval = flag.Duration(\"interval\", 1*time.Second, \"\u8f6e\u8be2\u95f4\u9694\")\n        timeout time.Duration\n    )\n    \n    flag.DurationVar(&amp;timeout, \"timeout\", 30*time.Second, \"\u8d85\u65f6\u65f6\u95f4\")\n    \n    \/\/ \u81ea\u5b9a\u4e49\u7c7b\u578b\u53c2\u6570\n    var (\n        tags stringSlice\n        logLevel LogLevel = Info\n        allowedIPs IPList\n    )\n    \n    flag.Var(&amp;tags, \"tag\", \"\u6807\u7b7e\uff08\u53ef\u591a\u6b21\u4f7f\u7528\uff09\")\n    flag.Var(&amp;logLevel, \"log-level\", \"\u65e5\u5fd7\u7ea7\u522b: debug, info, warn, error\")\n    flag.Var(&amp;allowedIPs, \"allow-ip\", \"\u5141\u8bb8\u7684IP\u5730\u5740\")\n    \n    \/\/ \u89e3\u6790\u53c2\u6570\n    flag.Parse()\n    \n    \/\/ \u8f93\u51fa\u6240\u6709\u53c2\u6570\u503c\n    fmt.Println(\"=== \u53c2\u6570\u89e3\u6790\u7ed3\u679c ===\")\n    fmt.Printf(\"\u8c03\u8bd5\u6a21\u5f0f: %v\\n\", *debug)\n    fmt.Printf(\"\u8be6\u7ec6\u8f93\u51fa: %v\\n\", *verbose)\n    fmt.Printf(\"\u7aef\u53e3: %d\\n\", *port)\n    fmt.Printf(\"\u4f18\u5148\u7ea7: %d\\n\", *priority)\n    fmt.Printf(\"\u6700\u5927\u5c3a\u5bf8: %d MB\\n\", *maxSize)\n    fmt.Printf(\"\u5904\u7406\u901f\u7387: %.2f\\n\", *rate)\n    fmt.Printf(\"\u6e29\u5ea6: %.1f\u2103\\n\", *temperature)\n    fmt.Printf(\"\u59d3\u540d: %s\\n\", *name)\n    fmt.Printf(\"\u914d\u7f6e\u6587\u4ef6: %s\\n\", *config)\n    fmt.Printf(\"\u8f6e\u8be2\u95f4\u9694: %v\\n\", *interval)\n    fmt.Printf(\"\u8d85\u65f6\u65f6\u95f4: %v\\n\", timeout)\n    fmt.Printf(\"\u6807\u7b7e: %v\\n\", &#91;]string(tags))\n    fmt.Printf(\"\u65e5\u5fd7\u7ea7\u522b: %s\\n\", logLevel)\n    fmt.Printf(\"\u5141\u8bb8\u7684IP: %v\\n\", &#91;]net.IP(allowedIPs))\n    \n    \/\/ \u663e\u793a\u5e2e\u52a9\u4fe1\u606f\n    if len(flag.Args()) > 0 &amp;&amp; flag.Args()&#91;0] == \"help\" {\n        flag.PrintDefaults()\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u6267\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run demo.go \\\n    --debug \\\n    --verbose \\\n    --port=9090 \\\n    --priority=5 \\\n    --max-size=2048 \\\n    --rate=0.8 \\\n    --temp=30.5 \\\n    --name=\"\u5f20\u4e09\" \\\n    --config=\"\/etc\/app\/config.yaml\" \\\n    --interval=5s \\\n    --timeout=1m \\\n    --tag=api \\\n    --tag=database \\\n    --log-level=debug \\\n    --allow-ip=192.168.1.1 \\\n    --allow-ip=10.0.0.1<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\/\/ \u5b9a\u4e49\u53ef\u91cd\u590d\u53c2\u6570\/\/ \u58f0\u660e\u53d8\u91cf\/\/ \u89e3\u6790 arg \u683c\u5f0f\u7684\u53c2\u6570\/\/ \u89e3\u6790\u53c2\u6570\/\/ \u8f93\u51fa\u6d4b\u8bd5<\/p>\n","protected":false},"author":1,"featured_media":727,"comment_status":"open","ping_status":"open","sticky":false,"template":"single-with-sidebar","format":"standard","meta":{"footnotes":""},"categories":[286,154],"tags":[502,298,287,503],"class_list":["post-1533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-go","category-154","tag-flag","tag-go","tag-golang","tag-slice"],"_links":{"self":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1533"}],"version-history":[{"count":5,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1533\/revisions"}],"predecessor-version":[{"id":2377,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1533\/revisions\/2377"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/media\/727"}],"wp:attachment":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}