Golang에서 긴 코드 줄을 끊는 방법은 무엇입니까?


108

Python에서 왔기 때문에 80 열보다 긴 코드 줄을 보는 데 익숙하지 않습니다. 그래서 이것을 만나면 :

err := database.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

나는 그것을 깨려고 노력했다

err := database.QueryRow("select * from users where user_id=?", id) \
    .Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)

하지만 나는

 syntax error: unexpected \

나는 또한 엔터를 치면서 줄을 끊고 끝에 세미콜론을 넣었습니다.

err := database.QueryRow("select * from users where user_id=?", id) 
.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email);

그러나 나는 다시 얻는다 :

syntax error: unexpected .

그래서 나는 그렇게하는 골 랑어 방법이 무엇인지 궁금합니다.

답변:


122

먼저 몇 가지 배경. Go의 공식 문법은 ";"많은 프로덕션에서 세미콜론 을 종결 자로 사용 하지만 Go 프로그램은 대부분을 생략 할 수 있습니다 (더 명확하고 쉽게 읽을 수있는 소스를 가져야하며 gofmt불필요한 세미콜론도 제거합니다).

사양은 정확한 규칙을 나열합니다. 사양 : 세미콜론 :

형식 문법은 세미콜론 ";"을 사용합니다. 여러 프로덕션에서 종결 자로 사용됩니다. Go 프로그램은 다음 두 가지 규칙을 사용하여 이러한 세미콜론을 대부분 생략 할 수 있습니다.

  1. 입력이 토큰으로 분리 될 때 해당 토큰이

  2. 복잡한 문이 한 줄을 차지할 수 있도록 닫는 ")"또는 "}"앞에 세미콜론을 생략 할 수 있습니다.

따라서 괄호 뒤에 개행 문자를 삽입하면 알 수 있듯이 )세미콜론 ;이 자동으로 삽입되므로 다음 행은 이전 행의 연속으로 처리되지 않습니다. 이것은 귀하의 경우 일어로 시작하고 다음 줄이 그래서 무엇을 .Scan(&ReadUser.ID,...당신에게로이 서로 컴파일 타임 오류 줄 것 자체가 (이전 라인이없는 것은) 컴파일 타임 오류가 발생합니다 :syntax error: unexpected .

따라서 1.위의 항목에 나열된 규칙과 충돌하지 않는 경우 언제든지 줄을 끊을 수 있습니다 .

일반적으로는 쉼표 후 라인을 깰 수 ,후, 여는 괄호 예를 들어 (, [, {, 및 점 이후에 .일부 값의 필드 나 메소드를 참조 할 수있다. 이항 연산자 (2 개의 피연산자가 필요한 연산자) 뒤에 줄을 끊을 수도 있습니다. 예 :

i := 1 +
        2
fmt.Println(i) // Prints 3

여기서 주목할 가치가있는 한 가지는 초기 값을 나열하는 구조체 또는 슬라이스 또는 맵 리터럴이 있고 마지막 값을 나열한 후 줄을 끊으려면 ,이것이 마지막 값이고 아니요 인 경우에도 필수 쉼표를 넣어야한다는 것 입니다. 더 많은 것들이 뒤따를 것입니다.

s := []int {
    1, 2, 3,
    4, 5, 6,  // Note it ends with a comma
}

이는 세미콜론 규칙을 따르고 마지막 쉼표를 추가 / 제거하지 않고도 새 줄을 다시 정렬하고 추가 할 수 있도록하기위한 것입니다. 예를 들어 새 쉼표를 제거하고 추가하지 않고도 두 줄을 간단히 바꿀 수 있습니다.

s := []int {
    4, 5, 6,
    1, 2, 3,
}

함수 호출에 인수를 나열 할 때도 마찬가지입니다.

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)

3
나는 자바 스크립트 리터럴 끝에 쉼표를 계속 넣습니다. #hatejs
파울로 Scardine

27
요약 : 일반적으로 쉼표 뒤, 괄호를 연 뒤, (, [, {, 그리고 어떤 값의 필드 나 메서드를 참조 할 수있는 점 뒤) 줄을 끊을 수 있습니다.
Peeter Kokk

2
끝에 쉼표를 추가해야하는 것은 이전 IE js 버그를 떠올리게합니다. 끔찍한
Christophe Roussy

4
@ChristopheRoussy 모든 줄이 쉼표로 끝나야한다는 것은 주관적이며, 쉼표를 추가 / 제거 할 필요없이 쉽게 새 줄을 재정렬하고 추가 할 수 있습니다.
icza 2016

@icza, 나 또한 그들처럼 쉼표로 종료합니다,하지만 :) 마지막을 위해 그것을 할 필요가 없습니다
크리스토프 후씨

22

가장 간단한 방법은 .첫 번째 줄에 연산자 ( )를 그대로 두는 것 입니다.

\ 줄 연속은 많은 파이썬 스타일 가이드에서 권장되지 않습니다.이 기술은 두 언어 모두에서 작동하므로 go와 python 사이를 앞뒤로 이동하는 경우 전체 표현식을 괄호로 래핑 할 수 있습니다.


마지막에 운영자를 떠나는 것에 대한 좋은 팁. 효과가있었습니다.
Karlom

1
괄호로 묶는 것은 go afaik에서 작동하지 않습니다. 계속해서 괄호 안에 세미콜론을 삽입하십시오
Adrian Shum

방금 시도해 보았고 Go는 실제로 괄호 안에 보이지 않는 세미콜론을 삽입합니다. 따라서 이것은 Go가 아닌 Python에서만 작동합니다.
Roland Illig

@RolandIllig이 확실히 작동합니다 play.golang.org/p/oFKaxLTphU을
tobyodavies

제 표현에 대해 죄송합니다. 저는 괄호 사용을 언급하고있었습니다 (하지만 작성하지는 않았습니다). 표현식을 괄호로 묶는 것은 Python에서 작동 할 수 있지만 Go에서는 작동하지 않습니다.
Roland Illig

16

스타일의 문제이지만 다음을 좋아합니다.

err := database.QueryRow(
    "select * from users where user_id=?", id,
).Scan(
    &ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email,
)

16

언급했듯이 이것은 스타일 선호도의 문제입니다. 바둑의 창작자들이 내가 배운 경험을 바탕으로 한 스타일을 제안했지만 내 경험에서 내 스타일을 일부 유지한다는 것을 이해합니다.

다음은 이것을 포맷하는 방법입니다.

err := database.
  QueryRow("select * from users where user_id=?", id).
  Scan(
    &ReadUser.ID,
    &ReadUser.Name,
    &ReadUser.First,
    &ReadUser.Last,
    &ReadUser.Email,
  )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.