синтаксическая ошибка: неожиданная точка с запятой или символ новой строки, ожидающий} - PullRequest
6 голосов
/ 09 марта 2012

У меня есть этот пример кода, где я определяю массив, но он не компилируется:

$ cat a.go
package f
func t() []int  {
    arr := [] int {
        1,
        2
    }
    return arr
}

oreyes@OREYES-WIN7 ~/code/go
$ go build a.go
# command-line-arguments
.\a.go:5: syntax error: unexpected semicolon or newline, expecting }
.\a.go:7: non-declaration statement outside function body
.\a.go:8: syntax error: unexpected }

Однако, если я удаляю символ новой строки, он работает:

$ cat a.go
package f
func t() []int  {
    arr := [] int {
        1,
        2 }
    return arr
}

oreyes@OREYES-WIN7 ~/code/go
$ go build a.go

Howcome

Ответы [ 2 ]

15 голосов
/ 09 марта 2012

Просто поставьте запятую (,) в конце всех строк, содержащих элементы массива:

arr :=  [] func(int) int {
    func( x int ) int { return x + 1 },
    func( y int ) int { return y * 2 }, // A comma (to prevent automatic semicolon insertion)
}
6 голосов
/ 09 марта 2012

Когда вход разбит на токены, точка с запятой автоматически вставляется в поток токенов в конце непустой строки, если последний токен строки равен

, идентификатор целое, плавающий-точечный, мнимый, символьный или строковый литерал, одно из ключевых слов разбить, продолжить, выполнить или вернуть один из операторов и разделителей ++, -,),] или}

source: http://golang.org/doc/go_spec.html#Semicolons

В конце этой строки вставлена ​​точка с запятой:

func( y int ) int { return y * 2 }

В некоторых случаях вам нужно знать это правило, так как оно предотвращает формирование васхотел бы иметь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...