Làm thế nào để bạn viết các chuỗi đa dòng trong Go?


Câu trả lời:


973

Theo đặc tả ngôn ngữ, bạn có thể sử dụng một chuỗi ký tự thô, trong đó chuỗi được phân cách bằng backticks thay vì dấu ngoặc kép.

`line 1
line 2
line 3`

176
Như một lưu ý phụ: 'trích dẫn thô' như tên gọi của nó, không phân tích các chuỗi thoát. Do đó, chuỗi chữ được lựa chọn để viết các mẫu biểu thức chính quy vì chúng thường chứa các chuỗi thoát không chuẩn sẽ khiến trình biên dịch Go phàn nàn về việc không thoát hai lần. Nó giữ cho các mẫu sạch và tương đối dễ đọc.
jimt

10
Cần phải cẩn thận với điều này khi sử dụng không gian endline mặc dù. Ví dụ: nếu bạn đặt một khoảng trắng sau line 1nó sẽ ẩn trong trình soạn thảo của bạn nhưng hiện diện trong chuỗi.
Ban nhạc Ory

2
@DanieleD Đó là một kết quả không nhẹ, nhưng phương ngữ nào? Có lẽ chủ yếu là MySQL? stackoverflow.com/a/10574031 Lưu ý rằng bằng cách mở rộng cùng một đối số, sẽ rất khó khăn khi nhúng markdown hoặc shell script (nếu bạn chọn sử dụng backtick thay cho $(abcd)).
Ivan Vučica

8
@KyleHeuton: Có lẽ là Daniele D đang sử dụng ký tự backtick trong các truy vấn SQL của anh ấy (như người dùng MySQL thường làm) và cảm thấy đau đớn khi phải thể hiện nó dưới dạng `+" `" + `và phá vỡ tính sao chép và khả năng sao chép.
ruakh

1
Mặt trái của vấn đề này là nếu bạn viết nó bên trong mã thụt lề, các tab sẽ được bao gồm trong chuỗi và để loại bỏ chúng sẽ làm cho mã của bạn trông xấu. Trong những trường hợp như vậy, tôi muốn sử dụng câu trả lời của Azeem
Mất Crotchet

111

Bạn có thể viết:

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

tương tự như:

"line 1line 2line3"

Không giống như sử dụng tick lại, nó sẽ bảo vệ các ký tự thoát. Lưu ý rằng "+" phải nằm trên dòng 'hàng đầu', nghĩa là:

"line 1"
+"line 2"

tạo ra một lỗi.


32
Giải pháp này không phải là tương tự như chuỗi multiline của Python. Nó tách literal chuỗi trên nhiều dòng, nhưng chuỗi chính nó không chứa nhiều dòng.
Ben Butler-Cole

2
Vì điều này bảo tồn các ký tự thoát, các dòng mới có thể được thêm vào một cách đơn giản \nvà dễ dàng hơn nhiều để làm việc với các chuỗi động và như vậy. Nếu tôi đúng, câu trả lời được chấp nhận thực sự là dành cho các chuỗi tĩnh trong mã để làm cho nó trông đẹp hơn.
RisingSun 2/2/2016

1
Điều đó cũng không hiệu quả lắm phải không? Đặt chuỗi là 3x một chuỗi 6 char: 6 + 2 * 6 + 3 * 6 = 36 ký tự được phân bổ khi tối ưu là 18 (vì các chuỗi là bất biến, mỗi khi bạn thêm hai chuỗi, một chuỗi mới được tạo với độ dài của hai chuỗi chuỗi nối).
N0thing

@ N0thing: nếu chỉ có chuỗi literals, không có sự khác biệt thời gian chạy như trình biên dịch sẽ tối ưu hóa. Nhưng có một nhỏ (micro, hoặc thậm chí nano giây) sự khác biệt trong thời gian biên dịch.
heo

Tôi tin rằng đây là cách tốt nhất để có được chuỗi ký tự nhiều dòng với kết thúc dòng CRLF
ldanilek

39

Từ literals chuỗi :

  • chuỗi ký tự thô hỗ trợ multiline (nhưng các ký tự thoát không được giải thích)
  • chuỗi giải thích theo nghĩa đen giải thích nhân vật trốn thoát, như ' \n'.

Nhưng, nếu chuỗi nhiều dòng của bạn phải bao gồm một backquote (`), thì bạn sẽ phải sử dụng một chuỗi được hiểu theo nghĩa đen:

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

Bạn không thể trực tiếp đặt backquote (`) trong một chuỗi ký tự thô (` `xx \).
Bạn phải sử dụng (như được giải thích trong " cách đặt backquote trong chuỗi backquote? "):

 + "`" + ...

33

Sử dụng chuỗi ký tự thô cho chuỗi nhiều dòng:

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

Chuỗi ký tự thô

Xâu liệu là chuỗi ký tự giữa dấu ngoặc kép trở lại, như trong `foo`. Trong dấu ngoặc kép, bất kỳ ký tự nào cũng có thể xuất hiện ngoại trừ trích dẫn ngược.

Một phần quan trọng là đó là thô đen không chỉ nhiều đường và có nhiều đường không phải là mục đích duy nhất của nó.

Giá trị của một chuỗi ký tự thô là chuỗi bao gồm các ký tự không được giải thích (ngầm định UTF-8 được mã hóa) giữa các dấu ngoặc kép; đặc biệt là những dấu xồ nguợc không có ý nghĩa đặc biệt ...

Vì vậy, sẽ không thoát được giải thích và dòng mới giữa ve sẽ dòng mới thực .

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

Ghép

Có thể bạn có dòng dài mà bạn muốn ngắt và bạn không cần dòng mới trong đó. Trong trường hợp này, bạn có thể sử dụng nối chuỗi.

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

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

Vì "" được giải thích chuỗi thoát theo nghĩa đen sẽ được diễn giải.

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

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

12

Đi và chuỗi đa dòng

Sử dụng lại ticks bạn có thể có chuỗi multiline:

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

Thay vì sử dụng dấu ngoặc kép (mệnh đề) hoặc ký hiệu trích dẫn đơn ('), thay vào đó, hãy sử dụng dấu kiểm ngược để xác định điểm bắt đầu và kết thúc của chuỗi. Sau đó bạn có thể bọc nó trên các dòng.

Nếu bạn thụt chuỗi mặc dù, hãy nhớ rằng khoảng trắng sẽ được tính.

Vui lòng kiểm tra sân chơi và làm thí nghiệm với nó.


4

Bạn có thể đưa nội dung với ` 'xung quanh nó, như

var hi = `I am here,
hello,
`

3

Bạn phải rất cẩn thận về định dạng và khoảng cách dòng khi đi, mọi thứ đều có giá trị và đây là một mẫu hoạt động, hãy thử 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)
}

3

bạn có thể sử dụng chữ thô. Thí dụ

s:=`stack
overflow`

0

Đối với tôi đây là những gì tôi sử dụng nếu thêm \nkhông phải là một vấn đề.

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

Khác bạn có thể sử dụng raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.