Shorthand return in Go (golang)

懵懂的女人 提交于 2020-01-11 13:57:07

问题


The following code generates a syntax error (unexpected ++ at end of statement) in Go 1.6 or 1.7:

package main

import "fmt"

var x int

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

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

Shouldn't this be permitted?


回答1:


It's an error, because the ++ and -- in Go are statements, not expressions: Spec: IncDec Statements (and statements have no results that would be returned).

For reasoning, see Go FAQ: Why are ++ and -- statements and not expressions? And why postfix, not prefix?

Without pointer arithmetic, the convenience value of pre- and postfix increment operators drops. By removing them from the expression hierarchy altogether, expression syntax is simplified and the messy issues around order of evaluation of ++ and -- (consider f(i++) and p[i] = q[++i]) are eliminated as well. The simplification is significant. As for postfix vs. prefix, either would work fine but the postfix version is more traditional; insistence on prefix arose with the STL, a library for a language whose name contains, ironically, a postfix increment.

So the code you wrote can only be written as:

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

And you have to call it without passing anything:

fmt.Println(increment())

Note that we would be tempted to still try to write it in one line using an assignment, e.g.:

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

But this also doesn't work in Go, because the assignment is also a statement, and thus you get a compile-time error:

syntax error: unexpected += at end of statement



来源:https://stackoverflow.com/questions/39280447/shorthand-return-in-go-golang

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!