go语言解析命令行参数的实现

本文介绍了一种使用Go语言进行命令行参数解析的方法,包括如何定义和解析各种类型的参数,如整数、字符串和布尔值。同时,还提供了一个实际的代码示例和编译后的测试结果,展示了如何正确地读取和处理命令行输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实现代码如下

// fffggg project main.go
package main

import (
    "flag"
    "fmt"
)

func main() {

    var num int
    var mode string
    var encrypt bool

    // 具体用法如下:

    // command -flagname
    // command --flagname
    // command -flagname=
    // command --flagname=
    // 注意“=”号前面和后面不能有空格

    // 第一步,定义Flag参数
    flag.IntVar(&num, "num", 38, "--num the password length")
    flag.StringVar(&mode, "mode", "mix", "--mode the password generate mode")
    flag.BoolVar(&encrypt, "encrypt", true, "--encrypt the password use RSA")

    // 第二步,调用flag.Parse()解析命令行参数到定义的Flag
    flag.Parse()

    // 调用Parse解析后,就可以直接使用绑定的变量了
    fmt.Printf("num:%d mode:%s encrypt:%v\n", num, mode, encrypt)
}

二、编译后测试结果

./fffggg --num 3 --mode nnn --encrypt true
num:3 mode:nnn encrypt:true

./fffggg --num 3 --mode nnn --encrypt false
num:3 mode:nnn encrypt:true

三、出现错误解决方法

将go/src/flag/flag.go中下面代码的红色部分代码提前即可

// parseOne parses one flag. It reports whether a flag was seen.
func (f *FlagSet) parseOne() (bool, error) {
    if len(f.args) == 0 {
        return false, nil
    }
    s := f.args[0]
    if len(s) == 0 || s[0] != '-' || len(s) == 1 {
        return false, nil
    }
    numMinuses := 1
    if s[1] == '-' {
        numMinuses++
        if len(s) == 2 { // "--" terminates the flags
            f.args = f.args[1:]
            return false, nil
        }
    }
    name := s[numMinuses:]
    if len(name) == 0 || name[0] == '-' || name[0] == '=' {
        return false, f.failf("bad flag syntax: %s", s)
    }

    // it's a flag. does it have an argument?
    f.args = f.args[1:]
    hasValue := false
    value := ""
    for i := 1; i < len(name); i++ { // equals cannot be first
        if name[i] == '=' {
            value = name[i+1:]
            hasValue = true
            name = name[0:i]
            break
        }
    }
    m := f.formal
    flag, alreadythere := m[name] // BUG
    if !alreadythere {
        if name == "help" || name == "h" { // special case for nice help message.
            f.usage()
            return false, ErrHelp
        }
        return false, f.failf("flag provided but not defined: -%s", name)
    }

    // It must have a value, which might be the next argument.
    if !hasValue && len(f.args) > 0 {
        // value is the next arg
        hasValue = true
        value, f.args = f.args[0], f.args[1:]
    }

    if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
        if hasValue {
            if err := fv.Set(value); err != nil {
                return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
            }
        } else {
            if err := fv.Set("true"); err != nil {
                return false, f.failf("invalid boolean flag %s: %v", name, err)
            }
        }
    } else {
        // It must have a value, which might be the next argument.
        if !hasValue && len(f.args) > 0 {
            // value is the next arg
            hasValue = true
            value, f.args = f.args[0], f.args[1:]
        }

        if !hasValue {
            return false, f.failf("flag needs an argument: -%s", name)
        }
        if err := flag.Value.Set(value); err != nil {
            return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
        }
    }
    if f.actual == nil {
        f.actual = make(map[string]*Flag)
    }
    f.actual[name] = flag
    return true, nil
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

princewwj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值