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.