【问题标题】:Shorthand return速记返回
【发布时间】:2016-09-01 20:34:31
【问题描述】:

以下代码在 Go 1.6 或 1.7 中生成语法错误(unexpected ++ at end of statement):

package main

import "fmt"

var x int

func increment() int {
        return x++   // not allowed
}

func main() {
  fmt.Println( increment() )
}

这不应该被允许吗?

【问题讨论】:

    标签: go shorthand


    【解决方案1】:

    这是一个错误,因为 Go 中的 ++-- 是语句,而不是表达式:Spec: IncDec Statements(并且语句没有可以返回的结果)。

    有关推理,请参阅 Go 常见问题解答:Why are ++ and -- statements and not expressions? And why postfix, not prefix?

    如果没有指针运算,前置和后置增量运算符的便利性会下降。通过将它们从表达式层次结构中完全删除,表达式语法得到了简化,并且围绕 ++ 和 --(考虑 f(i++) 和 p[i] = q[++i])的求值顺序的混乱问题也被消除了.简化意义重大。至于后缀与前缀,两者都可以正常工作,但后缀版本更传统;对前缀的坚持源于 STL,这是一个语言库,讽刺的是,它的名称包含一个后缀增量。

    所以你写的代码只能写成:

    func increment() int {
        x++
        return x
    }
    

    而且你必须在不传递任何东西的情况下调用它:

    fmt.Println(increment())
    

    请注意,我们仍会尝试使用赋值将其写在一行中,例如:

    func increment() int {
        return x += 1 // Compile-time error!
    }
    

    但这在 Go 中也不起作用,因为 assignment 也是一个语句,因此会出现编译时错误:

    语法错误:语句末尾出现意外 +=

    【讨论】:

    • 谢谢@icza,这很有启发性。很抱歉在确认您的回复方面出现巨大延迟。
    【解决方案2】:

    公认的解决方案是 OP 的代码不起作用,因为在 go increment/decrement(x++/x--) 语句中是不返回值的表达式。

    但是,提出的解决方案与原始请求的效果略有不同。

    x++ 将返回 x 的值,然后以类似 C 的语法递增。

    但是如果你这样做会发生相反的情况:

    x++
    return x
    

    您可以通过将初始值减一或使用此处编写的 defer 语句来否定该问题:

    func incr() int {
        defer func() { counter++ }()
        return counter
    }
    

    https://play.golang.org/p/rOuAv7KFJQw

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2014-11-15
      • 2012-02-08
      • 1970-01-01
      • 2023-03-23
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多