Закрывающая скобка на новой строке не компилируется - PullRequest
0 голосов
/ 02 декабря 2018

Этот код прекрасно компилируется:

return func(w http.ResponseWriter, r *http.Request) {


    if r.Header.Get("tc_req_body_type") != m["request_body"] {
        fmt.Println(
            strings.Join([]string{"types are different", " actual:",
                r.Header.Get("tc_req_body_type"), "expected:", m["request_body"]}," "))
    }

    if r.Header.Get("tc_resp_body_type") != m["response_body"] {
        fmt.Println(
            strings.Join([]string{"types are different", " actual: ",
                r.Header.Get("tc_req_body_type"), " expected: ", m["request_body"]}," "))
    }


    fmt.Printf("Req: %s\n", r.URL.Path)

    h.ServeHTTP(w, r)
}

, но если я добавлю новую строку после последнего имени в вызове fmt.Println:

return func(w http.ResponseWriter, r *http.Request) {


    if r.Header.Get("tc_req_body_type") != m["request_body"] {
        fmt.Println(
            strings.Join([]string{"types are different", " actual:",
                r.Header.Get("tc_req_body_type"), "expected:", m["request_body"]}," ")
        )  // <<< here
    }

    if r.Header.Get("tc_resp_body_type") != m["response_body"] {
        fmt.Println(
            strings.Join([]string{"types are different", " actual: ",
                r.Header.Get("tc_req_body_type"), " expected: ", m["request_body"]}," ")
        )  // <<<  here
    }


    fmt.Printf("Req: %s\n", r.URL.Path)

    h.ServeHTTP(w, r)
}

, теперь он не будеткомпилировать, в чем причина этого?Я добавил комментарий к разнице во втором примере кода, также просто написал больше б / к, он сказал, что в моем вопросе слишком много кода и недостаточно слов, спасибо.

1 Ответ

0 голосов
/ 02 декабря 2018

Спецификация языка программирования Go

Точки с запятой

В формальной грамматике используются точки с запятой ";"как терминаторы в ряде производств.Программы Go могут пропустить большинство этих точек с запятой, используя следующие два правила:

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

    .идентификатор

    .целое число, число с плавающей точкой, мнимый, рунический или строковый литерал

    .одно из ключевых слов обрыв, продолжение, падение или возврат

    .один из операторов и пунктуация ++, -,),] или}

  2. Чтобы разрешить сложным операторам занимать одну строку, точка с запятой может быть опущена перед закрытием ")"или"} ".


синтаксическая ошибка: неожиданный перевод строки, ожидание запятой или)

Добавьте запятые вконец строки списка аргументов, чтобы избежать автоматической вставки точек с запятой.

r.Header.Get("tc_req_body_type"), "expected:", m["request_body"]}, " "),
) 

r.Header.Get("tc_req_body_type"), " expected: ", m["request_body"]}, " "),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...