คุณเขียนสตริงหลายบรรทัดใน Go ได้อย่างไร


612

Does Go มีอะไรที่คล้ายกับสตริงหลายบรรทัดของ Python:

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

หากไม่เป็นเช่นนั้นวิธีที่ดีที่สุดในการเขียนสตริงคือการขยายหลายบรรทัด


คำตอบ:


973

ตามข้อกำหนดภาษาคุณสามารถใช้ตัวอักษรสตริงดิบซึ่งสตริงจะคั่นด้วย backticks แทนเครื่องหมายคำพูดคู่

`line 1
line 2
line 3`

176
ในฐานะที่เป็นข้อความด้านข้าง: 'ข้อความอ้างอิงแบบดิบ' ตามที่เรียกใช้ไม่แยกวิเคราะห์ลำดับการยกเว้น มันมีตัวเลือกสตริงที่แท้จริงในการเขียนรูปแบบการแสดงออกปกติเนื่องจากพวกเขามักจะมีลำดับหนีที่ไม่ได้มาตรฐานที่จะทำให้คอมไพเลอร์ไปบ่นไม่หนีสองครั้ง มันทำให้รูปแบบสะอาดและอ่านง่าย
jimt

10
ต้องระวังสิ่งนี้เมื่อใช้ช่องว่างของบรรทัดท้าย ตัวอย่างเช่นถ้าคุณใส่ช่องว่างหลังจากline 1นั้นจะมองไม่เห็นในเครื่องมือแก้ไขของคุณ แต่มีอยู่ในสตริง
วง Ory

2
@DanieleD นั่นเป็นผลสืบเนื่องเล็กน้อย แต่ภาษาถิ่นไหน? ส่วนใหญ่น่าจะเป็น MySQL? stackoverflow.com/a/10574031โปรดทราบว่าโดยส่วนขยายของอาร์กิวเมนต์เดียวกันมันเป็นความเจ็บปวดสำหรับการฝัง markdown หรือเชลล์สคริปต์ (ถ้าคุณเลือกที่จะใช้ backtick แทน$(abcd))
Ivan Vučica

8
@ KyleHeuton: น่าจะเป็น Daniele D ที่ใช้อักขระ backtick ในแบบสอบถาม SQL ของเขา / เธอ (ตามที่ผู้ใช้ MySQL มักจะทำ) และพบว่ามันเจ็บปวดที่จะต้องแสดงว่า `+ '' '+' และทำลายการคัดลอกและวางตัว
ruakh

1
ข้อเสียของเรื่องนี้คือถ้าคุณเขียนมันลงในโค้ดเว้า ๆ แล้วแท็บจะถูกรวมไว้ในสตริงและการกำจัดมันจะทำให้โค้ดของคุณดูน่าเกลียด ภายใต้สถานการณ์เช่นนี้ฉันต้องการใช้คำตอบของ Azeem
Lost

111

คุณสามารถเขียน:

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

ซึ่งเหมือนกับ:

"line 1line 2line3"

ต่างจากการใช้เครื่องหมายขีดหลังมันจะรักษาอักขระเลี่ยง โปรดทราบว่า "+" จะต้องอยู่ในบรรทัด 'นำ' เช่น:

"line 1"
+"line 2"

สร้างข้อผิดพลาด


32
การแก้ปัญหานี้ไม่ได้คล้ายกับสตริงหลายไพ ธ อน มันแยกสตริงตัวอักษรมากกว่าหลายบรรทัด แต่สตริงตัวเองไม่ได้มีหลายบรรทัด
เบ็นบัตเลอร์โคล

2
ตั้งแต่นี้จะรักษาตัวละครการหลบหนีบรรทัดใหม่สามารถเพิ่มเพียงแค่\nและง่ายต่อการทำงานกับสตริงแบบไดนามิกและเช่น ถ้าฉันถูกต้องคำตอบที่ได้รับการยอมรับนั้นมีไว้สำหรับสตริงคงที่ในโค้ดเพื่อให้ดูสวย
RisingSun

1
มันจะไม่ไร้ประสิทธิภาพเช่นกันหรือ? ปล่อยให้สตริงเป็น 3x ถ่านลำดับ 6: 6 + 2 * 6 + 3 * 6 = 36 ตัวอักษรที่จัดสรรเมื่อเหมาะสมที่สุดจะเป็น 18 (ตั้งแต่สตริงไม่เปลี่ยนรูปทุกครั้งที่คุณเพิ่มสองสตริงสตริงใหม่จะถูกสร้างขึ้นด้วยความยาวของทั้งสอง สตริงที่ต่อกัน)
N0 ทุกอย่าง

@ N0 ทุกอย่าง: หากมีเพียงตัวอักษรสตริงเท่านั้นไม่มีความแตกต่างแบบรันไทม์เนื่องจากคอมไพเลอร์จะปรับให้เหมาะสม แต่มีความแตกต่างเล็กน้อย (ไมโครวินาทีหรือแม้กระทั่งนาโนวินาที) ในเวลารวบรวม
dolmen

ฉันเชื่อว่านี่เป็นวิธีที่ดีที่สุดในการรับสตริงสตริงแบบหลายบรรทัดด้วยการสิ้นสุดสาย CRLF
ldanilek

39

จากตัวอักษรสตริง :

  • ตัวอักษรสตริงดิบรองรับหลายบรรทัด (แต่ตัวละครที่หนีออกมาจะไม่ถูกตีความ)
  • ตีความสตริงตัวอักษรตีความหนีอักขระเช่น ' \n'

แต่ถ้าสตริงหลายบรรทัดของคุณต้องมี backquote (`) คุณจะต้องใช้สตริงที่ตีความแล้ว:

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

คุณไม่สามารถใส่ backquote (`) ลงในสตริงสตริงตามตัวอักษร (` `xx \) ได้โดยตรง
คุณต้องใช้ (ดังอธิบายใน " วิธีใส่ backquote ในสตริง backquote? "):

 + "`" + ...

33

ใช้ตัวอักษรสตริงดิบสำหรับสตริงหลายบรรทัด:

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

ตัวอักษรสตริงดิบ

`foo`วัตถุดิบอักษรสตริงที่มีลำดับตัวอักษรระหว่างคำพูดกลับมาเช่นเดียวกับใน ภายในเครื่องหมายคำพูดอักขระใด ๆ อาจปรากฏขึ้นยกเว้นเครื่องหมายคำพูดด้านหลัง

ส่วนที่สำคัญคือตัวอักษรดิบไม่ใช่แค่หลายบรรทัดและเป็นหลายบรรทัดไม่ใช่จุดประสงค์เดียวของมัน

ค่าของสตริงตัวอักษรดิบคือสตริงที่ประกอบด้วยอักขระที่ไม่ถูกตีความ (โดยนัย UTF-8-encoded) อักขระระหว่างเครื่องหมายคำพูด; โดยเฉพาะแบ็กสแลชไม่มีความหมายพิเศษ ...

ดังนั้นหนีจะไม่ถูกตีความและสายใหม่ระหว่างเห็บจะสายใหม่จริง

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

แทนที่จะใช้เครื่องหมายคำพูดคู่ (“) หรือเครื่องหมายคำพูดเดี่ยว (') แทนที่จะใช้เครื่องหมายขีดหลังเพื่อกำหนดจุดเริ่มต้นและจุดสิ้นสุดของสตริง จากนั้นคุณสามารถพันทับเส้น

หากคุณเยื้องสตริงโปรดจำไว้ว่าช่องว่างจะนับ

โปรดตรวจสอบสนามเด็กเล่นและทำการทดลองกับมัน



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.