Go 速记返回

Go 速记返回,go,shorthand,Go,Shorthand,以下代码在Go 1.6或1.7中生成语法错误(语句结尾处出现意外+): package main import "fmt" var x int func increment() int { return x++ // not allowed } func main() { fmt.Println( increment() ) } 这难道不应该被允许吗?这是一个错误,因为Go中的++和--是语句,而不是表达式:(并且语句没有返回的结果) 有关推理,请参见常见问题解

以下代码在Go 1.6或1.7中生成语法错误(语句结尾处出现意外+):

package main

import "fmt"

var x int

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

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

这难道不应该被允许吗?

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

有关推理,请参见常见问题解答:

如果没有指针算法,前缀和后缀增量运算符的便利值将下降。通过将它们从表达式层次结构中完全删除,表达式语法得到简化,并且围绕++和--(考虑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中也不起作用,因为它也是一个语句,因此会出现编译时错误:

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


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

有关推理,请参见常见问题解答:

如果没有指针算法,前缀和后缀增量运算符的便利值将下降。通过将它们从表达式层次结构中完全删除,表达式语法得到简化,并且围绕++和--(考虑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中也不起作用,因为它也是一个语句,因此会出现编译时错误:

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


公认的解决方案是正确的,OP的代码不起作用,因为in go递增/递减(x++/x--)语句是不返回值的表达式

然而,提出的解决方案与原始请求的效果略有不同

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

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

x++
return x
您可以通过将初始值减少1或使用此处所述的延迟语句来否定该问题:

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

公认的解决方案是,OP的代码不起作用,因为in go递增/递减(x++/x--)语句是不返回值的表达式

然而,提出的解决方案与原始请求的效果略有不同

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

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

x++
return x
您可以通过将初始值减少1或使用此处所述的延迟语句来否定该问题:

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

谢谢@icza,这很有启发性。对您的回复延迟表示歉意。谢谢@icza,这很有启发性。对您的回复延迟表示歉意。