2014-10-10 125 views
0

功能makeEvenGenerator應該返回,在一個連續的方式產生偶數的函數:語法錯誤:不聲明語句外部函數體

package main 
import "fmt" 
func makeEvenGenerator() func() uint { 
    i := uint(0) 
    return func() (ret uint) { 
     ret = i 
     i += 2 
     return 
    } 
}func main() { 
    nextEven := makeEvenGenerator() 
    fmt.Println(nextEven()) // 0 
    fmt.Println(nextEven()) // 2 
    fmt.Println(nextEven()) // 4 
} 

當我運行它,我得到的錯誤syntax error: unexpected func, expecting semicolon or newlineNon-declaration statement outside function body

該代碼逐字從Caleb Doxsey編程入門。我不確定問題是什麼。

回答

4

您錯過了makeEvenGenerator末尾的「}」與main中的「func」之間的換行符。

我固定的錯誤和發佈的代碼到playground

+0

哦,謝謝。我不認爲編譯器關心那裏的換行符,因爲這兩個部分之間用大括號分開。 – Omid 2014-10-10 20:58:27

3

您在}之間錯過了makeEvenGeneratorfunc main末尾的新行。

同樣對於該圖案的另一種方法是使用一個信道不返回的函數:

func evenGenerator() <-chan uint { 
    ch := make(chan uint) 
    go func() { 
     i := uint(0) 
     for { 
      ch <- i 
      i += 2 
     } 
    }() 
    return ch 
} 

func main() { 
    evens := evenGenerator() 
    for i := 0; i < 3; i++ { 
     fmt.Println(<-evens) 
    } 
} 

playground

+1

這是一種替代方法,而不是「通常的方法」。例如,在這種情況下,使用信道具有一個百倍性能損失,3481納秒/ OP與34.4納秒/運算。 – peterSO 2014-10-11 14:49:41

+0

@peterSO好點,更新。順便提一下,頻道速度在1.4,211ns和2.23ns之間都有大幅提升。 – OneOfOne 2014-10-11 14:54:53

5

大約有分號規則。

The Go Programming Language Specification

Semicolons

The formal grammar uses semicolons ";" as terminators in a number of productions. Go programs may omit most of these semicolons using the following two rules:

  1. When the input is broken into tokens, a semicolon is automatically inserted into the token stream at the end of a non-blank line if the line's final token is an identifier an integer, floating-point, imaginary, rune, or string literal one of the keywords break, continue, fallthrough, or return one of the operators and delimiters ++, --,), ], or }
  2. To allow complex statements to occupy a single line, a semicolon may be omitted before a closing ")" or "}".

的錯誤是在這裏,

}func main() { 

寫,

} 
func main() {