在我的程序中,我以这种方式进行一系列顺序检查:
var value int
if !(ParseOrFail(inputStrVal, &value) &&
Validate(value)) {
return SomeErr
}
我知道只有Validate
返回true才会调用ParseOrFail
,但我不确定在所有这些情况下是否会获得更新的值。
这样做是否正确?或者我必须将指针传递给Validate
?
答案 0 :(得分:2)
The Go Programming Language Specification
表达式通过应用指定值的计算 操作符和操作符的功能。
操作数表示表达式中的基本值。操作数可以 是一个文字,一个(可能合格的)非空白标识符,表示一个 常量,变量或函数,一个产生一个的方法表达式 函数或带括号的表达式。
在包级别,初始化依赖性确定评估 变量中各个初始化表达式的顺序 声明。否则,在评估一个操作数时 表达式,赋值或返回语句,所有函数调用, 方法调用和通信操作在词法中进行评估 从左到右的顺序。
给定函数类型F的表达式f,
f(a1, a2, … an)
使用参数a1,a2,... an调用f。除一个特例外, 参数必须是可赋值的单值表达式 参数类型F和在调用函数之前计算。 表达式的类型是F.方法的结果类型 调用类似,但方法本身被指定为选择器 取决于方法的接收器类型的值。
逻辑运算符适用于布尔值并产生结果 与操作数相同的类型。评估右操作数 有条件
&& conditional AND p && q is "if p then q else false" || conditional OR p || q is "if p then true else q" ! NOT !p is "not p"
您的代码行为在Go Go Programming Language Specification中定义。
var value int
if !(ParseOrFail(inputStrVal, &value) && Validate(value)) {
return SomeErr
}
或者,在伪代码中,
ParseOrFail arguments are evaluated
ParseOrFail is called
if ParseOrFail == true
Validate arguments are evaluated
Validate is called
也就是说,在您的示例中(https://play.golang.org/p/l6XHbgQjFs),晚期评估。