【发布时间】: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。 -
是的,但是
old和new都是有效的变量名,你想表达什么意思? -
注意这个表达式的名字,“Short variable declaration”,这里的declaration很重要。在 Go 中,声明将 标识符 绑定到“对象”(在变量声明的情况下,它将标识符绑定到值,在类型声明中,它将标识符绑定到类型, 等等。)。因此,当您使用
:=时,左侧必须仅包含有效标识符(旧的、新的,无关紧要)。使用普通赋值表达式=,左侧被指定为表达式的列表,可以是标识符、指针间接、切片索引、映射索引等。 -
和
s[i], err := f()一样你做不到。