Go 戈朗早期或晚期的争论评估?

Go 戈朗早期或晚期的争论评估?,go,Go,在我的程序中,我以这种方式执行一系列顺序检查: var value int if !(ParseOrFail(inputStrVal, &value) && Validate(value)) { return SomeErr } 我知道只有当ParseOrFail返回true时才会调用Validate,但我不确定在所有这样的场景中它是否会得到更新的值 这样做对吗?或者我必须传递一个指针进行验证 游乐场连接: 表达式指定通过应用 将运算符和函数转换为操

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

var value int

if !(ParseOrFail(inputStrVal, &value) &&
     Validate(value)) {
    return SomeErr
}
我知道只有当ParseOrFail返回true时才会调用Validate,但我不确定在所有这样的场景中它是否会得到更新的值

这样做对吗?或者我必须传递一个指针进行验证

游乐场连接:

表达式指定通过应用 将运算符和函数转换为操作数

操作数表示表达式中的基本值。操作数可以是 是一个文本,可能是一个限定的非空标识符,表示 常量、变量或函数,生成 函数或带括号的表达式

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

给定函数类型为f的表达式f

f(a1, a2, … an)
用参数a1,a2,…an调用f。除了一个特殊情况外, 参数必须是可分配给 F和的参数类型在调用函数之前求值。 表达式的类型是F.A方法的结果类型 调用类似,但方法本身被指定为选择器 方法的接收器类型的值

逻辑运算符应用于布尔值并生成 与操作数的类型相同。计算右操作数 有条件地

&&    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编程语言规范中定义

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
即,在您的示例中,延迟评估

表达式指定通过应用 将运算符和函数转换为操作数

操作数表示表达式中的基本值。操作数可以是 是一个文本,可能是一个限定的非空标识符,表示 常量、变量或函数,生成 函数或带括号的表达式

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

给定函数类型为f的表达式f

f(a1, a2, … an)
用参数a1,a2,…an调用f。除了一个特殊情况外, 参数必须是可分配给 F和的参数类型在调用函数之前求值。 表达式的类型是F.A方法的结果类型 调用类似,但方法本身被指定为选择器 方法的接收器类型的值

逻辑运算符应用于布尔值并生成 与操作数的类型相同。计算右操作数 有条件地

&&    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编程语言规范中定义

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

也就是说,在您的示例中,延迟求值。

Validate每次都被调用,它的返回值只有在ParseOrFail返回true时才会被求值。除非ParseOfFail在单独的go例程中改变值,否则将使用更新的值调用Validate。@mkopriva如果第一个函数返回false,则不调用第二个函数。是的,我收回这句话:f,sorryValidate每次都被调用,它的返回值只有在parserfail返回true时才会被计算。除非ParseOfFail在单独的go例程中改变值,否则将使用更新的值调用Validate。@mkopriva如果第一个函数返回false,则不调用第二个函数。刚刚在操场登记。是的,我收回:f,对不起