【问题标题】:multiple assignment and creation with a pointer in golang在golang中使用指针进行多重赋值和创建
【发布时间】:2020-08-05 20:20:49
【问题描述】:

语言规范对我来说太难解析这个简单的问题,所以在这里问。

我写的

func take_arg(x *int64) {
    *x,_ = strconv.ParseInt(os.Args[1], 10, 64)
}

哪个有效。

但是,如果我尝试处理错误

func take_arg(x *int64) {
    *x, problem := strconv.ParseInt(os.Args[1], 10, 64)
    fix(problem)
}

我被编译器阻止了,因为non-name *x on left side of :=

——

edit:它通常适用于x, problem := …

——-

什么给了?我该怎么办?

【问题讨论】:

  • := 声明了一个新变量,*x 不是一个有效的变量名。 golang.org/ref/spec#Short_variable_declarations“我该怎么办?”预先声明problem 并使用=,b。使用 := 和有效的变量名,然后在错误检查后,将结果设置为 arg *x = validvariablename
  • @mkopriva 但是当其中一个变量存在而另一个不存在时,old,new := … 通常仍然有效。只是没有*old
  • 是的,但是oldnew 都是有效的变量名,你想表达什么意思?
  • 注意这个表达式的名字,“Short variable declaration”,这里的declaration很重要。在 Go 中,声明标识符 绑定到“对象”(在变量声明的情况下,它将标识符绑定到值,在类型声明中,它将标识符绑定到类型, 等等。)。因此,当您使用:= 时,左侧必须仅包含有效标识符(旧的、新的,无关紧要)。使用普通赋值表达式=,左侧被指定为表达式的列表,可以是标识符、指针间接、切片索引、映射索引等。
  • s[i], err := f()一样你做不到。

标签: pointers go


【解决方案1】:

func take_arg(x *int64){...} => x *int64heapx int64值的指针。

Package: strconv
func ParseInt(s string, base int, bitSize int) (i int64, err error)

返回int64error 的副本(新的不可变实例),并且您不能将返回value 分配给x pointer。你必须使用指针作为指针:

func take_arg(x *int64) {
    if i, err := strconv.ParseInt(os.Args[1], 10, 64); err != nil {
        *x = fix(err) // or other action, for example: *x = 777
    } else {
        *x = i
    }
}

【讨论】:

    【解决方案2】:

    解决此类问题的另一种方法是取消使用:=。只需在函数的第一行添加var problem error,就可以了

    *x,problem = strconv.ParseInt( os.Args[1],  10,64 )
    

    := 并不总是有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2014-09-06
      • 2010-09-11
      • 2018-09-08
      相关资源
      最近更新 更多