गोलंग में कोड की लंबी लाइन कैसे तोड़ें?


107

पायथन से आ रहा है, मैं 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 .

तो मैं सोच रहा हूँ कि ऐसा करने के लिए गोलगप्पे का क्या तरीका है?

जवाबों:


121

पहले कुछ पृष्ठभूमि। गो का औपचारिक व्याकरण ";"कई प्रस्तुतियों में अर्धविरामों को टर्मिनेटर के रूप में उपयोग करता है , लेकिन गो कार्यक्रम उनमें से अधिकांश को छोड़ सकते हैं (और उनके पास एक स्पष्ट, आसानी से पढ़ने योग्य स्रोत होना चाहिए; gofmtअनावश्यक अर्धविरामों को भी हटा देता है)।

विनिर्देश सटीक नियमों को सूचीबद्ध करता है। युक्ति: अर्धविराम:

औपचारिक व्याकरण अर्धविराम का उपयोग करता है ";" कई प्रस्तुतियों में टर्मिनेटर के रूप में। निम्नलिखित दो नियमों का उपयोग करके अधिकांश प्रोग्राम इन अर्धविरामों को छोड़ सकते हैं:

  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
}

यह अर्धविराम नियमों के अनुरूप है, और यह भी कि आप अंतिम कॉमा को जोड़ने / हटाने की देखभाल के बिना नई लाइनों को पुनर्व्यवस्थित और जोड़ सकते हैं; उदाहरण के लिए, आप बस 2 पंक्तियों को हटाने के लिए और एक नया अल्पविराम जोड़ने के लिए स्वैप कर सकते हैं:

s := []int {
    4, 5, 6,
    1, 2, 3,
}

फ़ंक्शन कॉल पर तर्क सूचीबद्ध करते समय यही बात लागू होती है:

fmt.Println("first",
    "second",
    "third",       // Note it ends with a comma
)

3
मैं जावास्क्रिप्ट शाब्दिक के अंत में एक अल्पविराम लगाता रहता हूं। # धेयज
पाउलो स्कार्डिन 16

26
टीएल; डीआर: आमतौर पर आप कोमा के बाद अपनी लाइनें तोड़ सकते हैं ,, कोष्ठक खोलने के बाद जैसे (,, [, {, और डॉट के बाद]। जो किसी मान का क्षेत्र या विधि का संदर्भ दे सकता है।
Peeter Kokk

2
अंत में एक अतिरिक्त अल्पविराम जोड़ने के बाद मुझे कुछ पुराने IE जेएस बग्स की याद दिलाता है, भयानक
क्रिस्टोफ़ रूसो

4
@ChristopheRoussy यह व्यक्तिपरक है, मुझे एक प्यार के लिए है कि सभी लाइनों को अल्पविराम के साथ समाप्त करना है, और मैं अल्पविराम जोड़ने / हटाने की देखभाल के बिना आसानी से नई पंक्तियों को पुनर्व्यवस्थित और जोड़ सकता हूं।
15

@icza, मैं भी उन्हें एक अल्पविराम के साथ समाप्त करना पसंद करता हूं, लेकिन पिछले एक के लिए ऐसा करने के लिए नहीं :)
क्रिस्टोफ़ रूसो

22

सबसे आसान तरीका यह है कि आप ऑपरेटर ( .पहली लाइन) को छोड़ दें ।

\ कई अजगर शैली गाइड में लाइन निरंतरता को भी हतोत्साहित किया जाता है, यदि आप गो और अजगर के बीच आगे और पीछे बढ़ रहे हैं तो आप पूरी अभिव्यक्ति को परेंस में लपेट सकते हैं क्योंकि यह तकनीक दोनों भाषाओं में काम करती है।


ऑपरेटर को अंत में छोड़ने के बारे में अच्छी टिप। इसने काम कर दिया।
कार्लोम

1
कोष्ठक में लपेटने से अफाक में काम नहीं होता है। कोष्ठक के भीतर अभी भी अर्धविराम डालें
एड्रियन शम

मैंने अभी इसकी कोशिश की, और गो को वास्तव में एक अदृश्य अर्धविराम सम्मिलित करता है, यहां तक ​​कि कोष्ठक के अंदर भी। तो यह केवल पायथन में काम करता है, गो में नहीं।
रोलैंड इलिग

@ रोलैंडलीग यह निश्चित रूप से काम करता है: play.golang.org/p/oFKaxLTphU
tobyodavies

मेरे शब्दों के लिए क्षमा करें, मैं कोष्ठक के उपयोग की बात कर रहा था (लेकिन ऐसा नहीं लिखा)। कोष्ठक में अभिव्यक्ति लपेटना पायथन में काम कर सकता है, लेकिन गो में काम नहीं करता है।
रोलैंड इलिग

16

यह शैली की बात है, लेकिन मुझे पसंद है:

err := database.QueryRow(
    "select * from users where user_id=?", id,
).Scan(
    &ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email,
)

16

जैसा कि उल्लेख किया गया है, यह शैली की प्राथमिकता का मामला है। मैं समझता हूं कि गो के रचनाकारों ने अपने अनुभव के आधार पर एक शैली का सुझाव दिया है, जिससे मैं सीखता हूं लेकिन अपने स्वयं के अनुभव से कुछ अपनी शैली भी रखता हूं।

नीचे यह है कि मैं इसे कैसे प्रारूपित करूंगा:

err := database.
  QueryRow("select * from users where user_id=?", id).
  Scan(
    &ReadUser.ID,
    &ReadUser.Name,
    &ReadUser.First,
    &ReadUser.Last,
    &ReadUser.Email,
  )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.