【问题标题】:cannot obain the function return values via pointers无法通过指针获取函数返回值
【发布时间】:2021-11-17 10:53:48
【问题描述】:

2021 年 9 月 26 日更新
我发现这是一个愚蠢的问题。

这是因为flag会在调用flag.Parse()后更新。

nReq := *flag_var
flag.Parse() // flag_var update
fmt.Println(nReq) // nReq is unchanged. 

因此,最佳做法是改用 flag.IntVar(),我们可以输入更少的字符。


为什么我不能像这样使用积分类型的返回值?

// test.go
nReq := *flag.Int("n", 10000, "set total requests")
flag.Parse()
fmt.Println(nReq)

// test -n 200
10000
// the value is still 10000.

它总是返回默认值(10000)。
我需要使用:

nReq := flag.Int("n", 10000, "set total requests")
flag.Parse()
fmt.Println(*nReq)

// test -n 200
200
// the value is updated to the new flag(200)

【问题讨论】:

  • val1 := * function() 和 val2 := *val1 有什么区别
  • 这样写是愚蠢的:val1 := func() *ptr, val2 := *val1。当我不想每次都写 *val1 时。
  • nReq = *func() 实际上无法获取标志的新值。它始终是默认值 (10000)。这可能是由于编译优化。
  • 代码sn-p来自一个大程序,在这个例子中我省略了flag.Parse。

标签: go pointers command-line-arguments


【解决方案1】:

flag.Int() 不会“立即”解析标志,它只是返回一个指向变量的指针,该变量将在解析时存储标志值。

因此,如果您立即取消引用它,您将只获得您提供的默认值。你必须打电话给flag.Parse()

如果您不想使用指针,请先声明变量,然后使用flag.IntVar(),例如:

var nReq int
flag.IntVar(&nReq, "n", 10000, "set total requests")

flag.Parse()
fmt.Println(nReq)

现在nReq 不是指针,您可以使用它而不必一直取消引用。

另一种选择是继续使用int.Var(),并取消引用返回的指针一次 flag.Parse() 已被调用:

nReqPtr := flag.Int("n", 10000, "set total requests")
flag.Parse()

nReq := *nReqPtr
fmt.Println(nReq)

【讨论】:

  • 使用 flag.IntVar 很糟糕,尤其是当我有很多不同类型的参数时。
  • 您可以在一次之后 flag.Parse() 取消引用flag.Int() 返回的指针。见编辑。
  • val1 := func() *ptr, val2 := *val1。这种形式仍然不完美。 golang flag.Parse 为什么不通过指针更新值?
  • @fripSide 如果您使用flag.IntVar(),这正是flag 包的作用。
  • 但是 flag.IntVar 需要先声明值。声明不同类型的变量是一场灾难。如果我们一起声明相同的类型,事情就会顺利进行。但是在 flag.Int 中返回一个默认指针是什么意思呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2011-09-17
  • 2019-04-20
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多