golang的早期或晚期论证评估?

时间:2017-04-14 13:04:30

标签: go

在我的程序中,我以这种方式进行一系列顺序检查:

var value int

if !(ParseOrFail(inputStrVal, &value) &&
     Validate(value)) {
    return SomeErr
}

我知道只有Validate返回true才会调用ParseOrFail,但我不确定在所有这些情况下是否会获得更新的值。

这样做是否正确?或者我必须将指针传递给Validate

游乐场链接:https://play.golang.org/p/l6XHbgQjFs

1 个答案:

答案 0 :(得分:2)

  

The Go Programming Language Specification

     

Expressions

     

表达式通过应用指定值的计算   操作符和操作符的功能。

     

Operands

     

操作数表示表达式中的基本值。操作数可以   是一个文字,一个(可能合格的)非空白标识符,表示一个   常量,变量或函数,一个产生一个的方法表达式   函数或带括号的表达式。

     

Order of evaluation

     

在包级别,初始化依赖性确定评估   变量中各个初始化表达式的顺序   声明。否则,在评估一个操作数时   表达式,赋值或返回语句,所有函数调用,   方法调用和通信操作在词法中进行评估   从左到右的顺序。

     

Calls

     

给定函数类型F的表达式f,

f(a1, a2, … an)
     

使用参数a1,a2,... an调用f。除一个特例外,   参数必须是可赋值的单值表达式   参数类型F和在调用函数之前计算。   表达式的类型是F.方法的结果类型   调用类似,但方法本身被指定为选择器   取决于方法的接收器类型的值。

     

Logical operators

     

逻辑运算符适用于布尔值并产生结果   与操作数相同的类型。评估右操作数   有条件

&&    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),晚期评估。