以下代码在Go 1.6或1.7中生成语法错误(语句结尾处的意外++ ):
package main
import "fmt"
var x int
func increment() int {
return x++ // not allowed
}
func main() {
fmt.Println( increment() )
}难道不应该允许这样做吗?
发布于 2016-09-01 20:37:33
这是一个错误,因为Go中的++和--是语句,而不是表达式:规范: IncDec语句 (和语句没有返回的结果)。
有关推理,请参见Go FAQ:为什么++和--语句而不是表达式?为什么是后缀而不是前缀?
没有指针算法,前置和后缀增量运算符的方便值就会下降.通过将它们从表达式层次结构中完全删除,表达式语法得到简化,并且消除了++和-(考虑f(i++)和pi = q++i)的计算顺序的杂乱问题。简化是非常重要的。至于后缀和前缀,两者都很好,但后缀版本更传统;对前缀的坚持出现在STL中,这是一种语言库,具有讽刺意味的是,它的名称包含一个后缀增量。
因此,您编写的代码只能编写为:
func increment() int {
x++
return x
}你必须叫它而不传递任何东西:
fmt.Println(increment())请注意,我们仍然会尝试使用赋值将其写成一行,例如:
func increment() int {
return x += 1 // Compile-time error!
}但是这在Go中也不起作用,因为分配也是一条语句,因此您得到了编译时错误:
语法错误:语句结尾处的意外+=
发布于 2020-07-16 16:12:07
可接受的解决方案是正确的,OP的代码不能工作,因为在go增量/递减(x++/x-)语句中,表达式不返回值。
但是,所提供的解决方案的效果与最初的请求略有不同。
x++将返回x的值,然后以类似C的语法递增。
然而,如果你这样做,则会发生相反的情况:
x++
return x您可以通过将初始值减少一个或使用如下所写的延迟语句来否定此问题:
func incr() int {
defer func() { counter++ }()
return counter
}https://stackoverflow.com/questions/39280447
复制相似问题