आप गो में मल्टीलाइन स्ट्रिंग्स कैसे लिखते हैं?


612

क्या गो के पास पाइथन के बहुस्तरीय तार के समान कुछ है:

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

यदि नहीं, तो कई पंक्तियों में फैले तार को लिखने का पसंदीदा तरीका क्या है?


जवाबों:


973

भाषा विनिर्देश के अनुसार आप एक कच्चे स्ट्रिंग शाब्दिक का उपयोग कर सकते हैं, जहां डबल कोट्स के बजाय बैकटिक्स द्वारा स्ट्रिंग को सीमांकित किया गया है।

`line 1
line 2
line 3`

176
एक साइड नोट के रूप में: 'कच्ची बोली' जैसा कि इसे कहा जाता है, सीक्वेंस से बचती नहीं है। यह नियमित अभिव्यक्ति पैटर्न लिखने के लिए पसंद के स्ट्रिंग शाब्दिक के रूप में है क्योंकि वे आमतौर पर गैर-मानक एस्केप सीक्वेंस होते हैं जो गो संकलक को डबल-एस्केप नहीं होने की शिकायत करेंगे। यह पैटर्न को साफ और अपेक्षाकृत पठनीय रखता है।
जिमी

10
हालांकि एंडलाइन रिक्त स्थान का उपयोग करते समय इसके साथ सावधान रहने की आवश्यकता है। उदाहरण के लिए यदि आप line 1इसके बाद एक स्थान रखते हैं तो यह आपके संपादक में अदृश्य होगा लेकिन स्ट्रिंग में मौजूद होगा।
ओरी बैंड

2
@ डैनीलेड यह एक मामूली नॉनट्रेडिटुर है, लेकिन कौन सी बोली है? संभवतः मुख्य रूप से MySQL? stackoverflow.com/a/10574031 ध्यान दें कि एक ही तर्क के विस्तार से, यह एम्बेडिंग मार्कडाउन या शेल स्क्रिप्ट्स के लिए दर्द है (यदि आप इसके स्थान पर बैकटिक का उपयोग करने का विकल्प चुनते हैं $(abcd))।
इवान वुज़िका

8
@KyleHeuton: संभवतः डेनियल डी अपने एसक्यूएल प्रश्नों (जैसा कि MySQL उपयोगकर्ता अक्सर करते हैं) में बैकटिक चरित्र का उपयोग कर रहे हैं, और इसे '+' '' + '' के रूप में प्रस्तुत करना और कॉपी-एंड-पास्टबिलिटी को तोड़ना दर्दनाक लगता है।
बर्बाद करें

1
इसका नकारात्मक पक्ष यह है कि यदि आप इसे इंडेंटेड कोड के अंदर लिख रहे हैं, तो टैब को स्ट्रिंग में शामिल किया जाएगा, और इनसे छुटकारा पाने के लिए आपका कोड बदसूरत दिखाई देगा। ऐसी परिस्थितियों में मैं अज़ीम के जवाब का उपयोग करना पसंद करूंगा
लॉस्ट क्रॉचेट

111

तुम लिख सकते हो:

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

जो समान है:

"line 1line 2line3"

वापस टिक्स का उपयोग करने के विपरीत, यह भागने के पात्रों को संरक्षित करेगा। ध्यान दें कि "+" को 'अग्रणी' लाइन पर होना चाहिए:

"line 1"
+"line 2"

एक त्रुटि उत्पन्न करता है।


32
यह समाधान पायथन के बहुस्तरीय तारों के अनुरूप नहीं है। यह कई लाइनों पर स्ट्रिंग शाब्दिक विभाजन करता है, लेकिन स्ट्रिंग में कई लाइनें नहीं होती हैं।
बेन बटलर-कोल

2
चूंकि यह भागने के पात्रों को संरक्षित करता है, नई लाइनों को बस के साथ जोड़ा जा सकता है \nऔर गतिशील तार और इस तरह के साथ काम करना बहुत आसान है। अगर मैं सही हूं, तो स्वीकृत उत्तर वास्तव में कोड में स्थिर स्ट्रिंग्स के लिए है ताकि यह सुंदर दिखाई दे।
राइजिंगसून

1
क्या यह बहुत अक्षम भी नहीं होगा? स्ट्रिंग को 3x 6 6 क्रम दें: 6 + 2 * 6 + 3 * 6 = 36 वर्णों का आवंटन तब किया जाता है जब इष्टतम 18 होगा (क्योंकि तार अपरिवर्तनीय होते हैं, हर बार जब आप दो स्ट्रिंग जोड़ते हैं तो एक नई स्ट्रिंग दो की लंबाई के साथ बनाई जाती है। तार संघनित)।
N0thing

@ N0thing: यदि केवल स्ट्रिंग शाब्दिक हैं, तो कोई रनटाइम अंतर नहीं है क्योंकि कंपाइलर अनुकूलन करेगा। लेकिन संकलन समय में एक छोटा (माइक्रोसेकंड, या यहां तक ​​कि नैनोसेकंड) अंतर है।
dolmen

मेरा मानना ​​है कि यह CRLF लाइन एंडिंग के साथ एक
बहुस्तरीय

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.
             `
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.