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

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 .

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



답변

먼저 몇 가지 배경. 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
)


답변

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

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


답변

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

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,
  )


답변