Go에서 여러 줄로 된 문자열을 어떻게 작성합니까?


답변:


973

에 따르면 언어 사양 당신은 문자열 대신 큰 따옴표의 역 따옴표로 구분되는 원시 문자열 리터럴을 사용할 수 있습니다.

`line 1
line 2
line 3`

176
참고로 : '원시 견적'이라고 불리는 이스케이프 시퀀스를 구문 분석하지 않습니다. 따라서 정규 표현식 패턴을 작성하는 것은 일반적으로 Go 컴파일러가 이중 이스케이프 처리를하지 않도록하는 비표준 이스케이프 시퀀스를 포함하기 때문에 선택하는 문자열 리터럴입니다. 깨끗하고 비교적 읽기 쉬운 패턴을 유지합니다.
jimt

10
엔드 라인 공백을 사용할 때는이 점에주의해야합니다. 예를 들어 공백을 넣은 후에 line 1는 편집기에서 보이지 않지만 문자열에는 표시됩니다.
Ory Band

2
@DanieleD 그것은 약간 비 평범하지만 어떤 방언입니까? 아마도 주로 MySQL? stackoverflow.com/a/10574031 같은 인수를 확장하면 마크 다운 또는 셸 스크립트를 포함시키는 데 어려움이 있습니다 (대신에 백틱을 사용하도록 선택한 경우 $(abcd)).
Ivan Vučica

8
@KyleHeuton : Daniele D는 MySQL 쿼리에서 자주 사용하는 것처럼 SQL 쿼리에 백틱 문자를 사용하고 있으며이를`+ "`"+`로 표시하고 복사 및 붙여 넣기 기능을 중단해야한다는 것을 아는 경우가 있습니다.
ruakh

1
단점은 들여 쓰기 된 코드로 작성하면 탭이 문자열에 포함되고 제거하면 코드가보기 흉하게 보일 수 있다는 것입니다. 이런 상황에서 나는 Azeem의 대답 사용하는 것을 선호
분실 분 음표

111

당신은 쓸 수 있습니다:

"line 1" +
"line 2" +
"line 3"

이는 다음과 같습니다.

"line 1line 2line3"

백틱을 사용하는 것과 달리 이스케이프 문자를 유지합니다. "+"는 반드시 'leading'줄에 있어야합니다.

"line 1"
+"line 2"

오류를 생성합니다.


32
이 솔루션은 Python의 여러 줄 문자열과 유사하지 않습니다. 문자열 리터럴을 여러 줄로 나누지 만 문자열 자체에는 여러 줄이 없습니다.
Ben Butler-Cole

2
이렇게하면 이스케이프 문자가 유지되므로 새 줄을 간단하게 추가 할 수 있으며 \n동적 문자열 등으로 작업하기가 훨씬 쉽습니다. 내가 맞다면, 허용되는 대답은 실제로 코드의 정적 문자열이 예쁘게 보이도록하는 것입니다.
RisingSun

1
그것도 비효율적이지 않습니까? 문자열을 3x 6 문자 시퀀스로 지정하십시오. 6 + 2 * 6 + 3 * 6 = 36 문자는 최적이 18 일 때 할당됩니다 (문자열은 불변이므로 두 개의 문자열을 추가 할 때마다 두 개의 길이로 새 문자열이 작성 됨) 연결된 문자열).
N0thing

@ N0thing : 문자열 리터럴 만있는 경우 컴파일러가 최적화 할 때 런타임 차이가 없습니다. 그러나 컴파일 시간에는 약간의 차이 (마이크로 초 또는 나노초)가 있습니다.
고인돌

나는이 여러 줄 문자열 CRLF 라인 엔딩 리터럴 얻을 수있는 가장 좋은 방법이라고 생각
ldanilek

39

에서 문자열 리터럴 :

  • 원시 문자열 리터럴은 여러 줄을 지원하지만 이스케이프 된 문자는 해석되지 않습니다.
  • 해석 된 문자열 리터럴은 ' \n' 와 같이 이스케이프 된 문자를 해석합니다 .

그러나 여러 줄 문자열에 백 따옴표 (`)를 포함해야하는 경우 해석 된 문자열 리터럴을 사용해야합니다.

`line one
  line two ` +
"`" + `line three
line four`

원시 문자열 리터럴 (``xx '')에는 역 따옴표 (`)를 직접 넣을 수 없습니다 \.
" 뒤 인용 된 문자열에 역 따옴표를 넣는 방법 "에 설명 된대로 사용해야합니다 .

 + "`" + ...

33

여러 줄 문자열에 원시 문자열 리터럴을 사용하십시오.

func main(){
    multiline := `line 
by line
and line
after line`
}

원시 문자열 리터럴

원시 문자열 리터럴은에서와 같이 백 따옴표 사이의 문자 시퀀스입니다 `foo`. 따옴표 안에는 따옴표를 제외한 모든 문자가 나타날 수 있습니다.

중요한 부분은 단순한 다중 행이 아닌 원시 리터럴이며 다중 행이 유일한 목적은 아니라는 것입니다.

원시 문자열 리터럴의 값은 따옴표 사이에 해석되지 않은 (암시 적으로 UTF-8로 인코딩 된) 문자로 구성된 문자열입니다. 특히 백 슬래시는 특별한 의미가 없습니다 ...

따라서 이스케이프는 해석되지 않으며 틱 사이의 새 줄은 실제 새 줄이 됩니다.

func main(){
    multiline := `line 
by line \n
and line \n
after line`

    // \n will be just printed. 
    // But new lines are there too.
    fmt.Print(multiline)
}

연쇄

아마도 당신은 당신이 끊고 싶은 긴 줄을 가지고 있으며 그것에 새로운 줄이 필요하지 않습니다. 이 경우 문자열 연결을 사용할 수 있습니다.

func main(){
    multiline := "line " +
            "by line " +
            "and line " +
            "after line"

    fmt.Print(multiline) // No new lines here
}

""는 해석되므로 문자열 리터럴 이스케이프는 해석됩니다.

func main(){
    multiline := "line " +
            "by line \n" +
            "and line \n" +
            "after line"

    fmt.Print(multiline) // New lines as interpreted \n
}

12

이동 및 여러 줄 문자열

백틱을 사용하면 여러 줄 문자열을 가질 수 있습니다.

package main

import "fmt"

func main() {

    message := `This is a 
Multi-line Text String
Because it uses the raw-string back ticks 
instead of quotes.
`

    fmt.Printf("%s", message)
}

큰 따옴표 (“) 또는 작은 따옴표 ( ')를 사용하는 대신 백틱을 사용하여 문자열의 시작과 끝을 정의하십시오. 그런 다음 여러 줄로 줄 바꿈 할 수 있습니다.

문자열을 들여 쓰면 공백이 포함된다는 점을 기억하십시오.

놀이터를 확인하고 실험 해보십시오.


4

주위에``로 내용을 넣을 수 있습니다.

var hi = `I am here,
hello,
`

3

이동 중에도 서식과 줄 간격에 매우주의해야합니다. 모든 것이 중요하며 여기에는 작동하는 샘플이 있습니다. https://play.golang.org/p/c0zeXKYlmF

package main

import "fmt"

func main() {
    testLine := `This is a test line 1
This is a test line 2`
    fmt.Println(testLine)
}


0

나를 위해 이것은 추가 \n가 문제가되지 않는 경우 사용 하는 것입니다.

fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")

그렇지 않으면 사용할 수 있습니다 raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.