我们有一个应用程序,它在函数中接收urfave cli上下文对象:

import "gopkg.in/urfave/cli.v1"

func runApp(ctx *cli.Context) {
   cache := ctx.GlobalInt(MyFlag.Name)
   .... // do more stuff
}

我正在试着拨打runApp,而不是所有CLI的东西,直接从代码.因此,我必须手动构建ctx:


func MyTest() {
  fs := flag.NewFlagSet("", flag.ExitOnError)
  app := cli.NewApp()
  fs.Set(MyFlag.Name, "5000")
  ctx := cli.NewContext(app, fs, nil)
  runApp(ctx)
}

但它实际上看起来标志从未设置,runApp从未看到我手动设置的值.

我做错了什么?这真的能做到吗?

推荐答案

It looks like MyFlag.Name this field is not actually defined as a flag. To define it as a flag, you need do this: fs.String(MyFlag.Name, "5000", "usageOfTheFlag")
After this you can use fs.Set for MyFlag.Name.

var MyFlag = flag.Flag{
    Name: "TestFlag",
}

func MyTest() {
  fs := flag.NewFlagSet("", flag.ExitOnError)
  app := cli.NewApp()
  // define a flag with default value
  fs.String(MyFlag.Name, "5000", "usageOfTheFlag")
  // set a new value
  err := fs.Set(MyFlag.Name, "5000")

  if err != nil {
     fmt.Println(err)
     return
  }

  ctx := cli.NewContext(app, fs, nil)
  runApp(ctx)
}
func runApp(ctx *cli.Context) {
   cache := ctx.GlobalInt(MyFlag.Name)
   .... // do more stuff
}

如果您要使用您的标志名在fs.Set上执行错误判断,而不将其定义为标志:

// fs.String(MyFlag.Name, "5000", "usageOfTheFlag")
err := fs.Set(MyFlag.Name, "5000")

    if err != nil {
        fmt.Println(err)
        return
    }

如果标志的名称当前未定义为标志,则会出现此错误. 在本例中为"TestFlag":

no such flag -TestFlag

因此,MyFlag.Name没有获得新值,因此您的程序没有看到您的新值.

Go相关问答推荐

你能帮我优化一个golang代码关于函数CrossPointTwoRect

调用API时使用nginx作为反向代理时从nginx获取502坏网关

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

错误.如果它包含切片,则返回FALSE

如何用';贪婪原则';正确地

如何创建在responseWriter.Write 上返回错误的http.ResponseWriter 模拟实例?

Go安装成功但没有输出简单的Hello World

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

为什么我只收到部分错误而不是我启动的 goroutines 的所有错误?

杜松子wine 和中间件

如何使用 sync.WaitGroup 来执行所有的 goroutine?

无法将 graphql-ws 连接到 gqlgen

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

grpc-gateway:重定向与定义不匹配(原始文件)

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

在 Gorm 的 AfterFind() 钩子中获取智能 Select struct 的值

为什么当我忽略 template.New() 程序可以成功运行?

跟踪长时间运行的任务的进度 - 正确的方法

从 Go struct 中提取标签作为 reflect.Value