为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Golang 中借助标志使用随机参数

如何在 Golang 中借助标志使用随机参数

Go
吃鸡游戏 2023-04-24 16:22:54
我希望来自控制台的输入是匿名参数。我目前的执行方式是./app -infc=eth0 -ip=192.168.0.1我不想要这个,因为我需要这个应用程序是通用的,这样我也可以将它用于其他目的。我希望 CLI 是这样的./app -firstparam={{infc},eth0} -secondparam={{ip},192.168.0.1}所以这基本上应该通过读取参数中的两列来工作。所以它应该将参数解析为内部键值对需要有关如何将每个参数存储为键值对并稍后单独使用它们的帮助
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

这是一个准系统示例,让您了解如何处理 os.Args


$ go run main.go --foo asdf --bar xxx --baz ccc

map[--foo:asdf --bar:xxx --baz:ccc]

jsandrew-Mac:osarg jsandrew$ cat main.go

package main


import (

    "fmt"

    "os"

)


func manyRandomArg() map[string]string {

    rv := make(map[string]string)

    for ix, x := range os.Args {

        if x[:2] == "--" {

            rv[x] = os.Args[ix+1]

        }

    }

    return rv

}


func main() {

    fmt.Printf("%v\n", manyRandomArg())

}


查看完整回答
反对 回复 2023-04-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

package main


import (

    "fmt"

    "io/ioutil"

    "log"

    "os"

    "regexp"

    "strings"

)


var key0, key1, key2, key3, key4, filename string

var fileext = regexp.MustCompile(`([a-z]+)\.yaml`)


func manyRandomArg() map[string]string {

    rv := make(map[string]string)

    for ix, x := range os.Args {

        if x[:2] == "--" {

            rv[x] = os.Args[ix+1]

        }

    }

    return rv

}


func main() {

    fmt.Printf("\n%v\n", manyRandomArg())

    readargs()

}

func readargs() {


    rv := manyRandomArg()

    keys := make([]string, 0, len(rv))

    for key, _ := range rv {

        keys = append(keys, key)

    }

    // Convert map to slice of values.

    values := []string{}

    for _, value := range rv {

        values = append(values, value)

    }


    for keys, values := range rv {

        fmt.Printf("key[%s] value[%s]\n", keys, values)

    }

    if fileext.MatchString(values[0]) {

        fmt.Printf("Value %s\n", values[0])

        filename = values[0]

    } else if fileext.MatchString(values[1]) {

        fmt.Printf("Value %s\n", values[1])

        filename = values[1]

    } else if fileext.MatchString(values[2]) {

        fmt.Printf("Value %s\n", values[2])

        filename = values[2]

    } else if fileext.MatchString(values[3]) {

        fmt.Printf("Value %s\n", values[3])

        filename = values[3]

    } else if fileext.MatchString(values[4]) {

        fmt.Printf("Value %s\n", values[4])

        filename = values[4]

    } else {

        log.Fatal("index 4 fail")

        os.Exit(1)

    }


    b, err := ioutil.ReadFile(filename) // just pass the file name

    if err != nil {

        fmt.Print(err)

    }

    str := string(b) // convert content to a 'string'

    key0 = trimLeftChars(keys[0], 2)

    key1 = trimLeftChars(keys[1], 2)

    key2 = trimLeftChars(keys[2], 2)

    key3 = trimLeftChars(keys[3], 2)

    key4 = trimLeftChars(keys[4], 2)


    // Create replacer with pairs as arguments.

    r := strings.NewReplacer(key0, values[0], key1, values[1], key2, values[2], key3, values[3], key4, values[4])


    // Replace all pairs.

    result := r.Replace(str)

    fmt.Println(result)


    newContents := []byte(result)

    err = ioutil.WriteFile("new3.yaml", newContents, 0664)

    if err != nil {

        panic(err)

    }

}

func trimLeftChars(s string, n int) string {

    m := 0

    for i := range s {

        if m >= n {

            return s[i:]

        }

        m++

    }

    return s[:0]

}


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信