2016-09-01 7 views
-1

Следующий код создает синтаксическую ошибку (неожиданную ++ в конце заявления) в Go 1.6 или 1.7:Shorthand возвращение в Go (golang)

package main 

import "fmt" 

var x int 

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

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

Не должно ли это быть разрешено?

ответ

3

Это ошибка, потому что ++ и -- в Go являются операторами, а не выражениями: Spec: IncDec Statements (и операторы не имеют результатов, которые будут возвращены).

Для рассуждения см 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.

Таким образом, код, который вы написали можно записать только как:

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

И вы должны назвать его, не проходя ничего:

fmt.Println(increment()) 

Обратите внимание, что у нас возникнет соблазн по-прежнему пытаться записать его в одной строке с помощью assi gnment, например .:

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

Но это также не работает в Go, потому что assignment также заявление, и, таким образом, вы получите ошибку компиляции:

syntax error: unexpected += at end of statement

 Смежные вопросы

  • Нет связанных вопросов^_^