2013-01-24 41 views
17

वर्तमान में, जाने के कार्यक्रमों में एक नई पंक्ति का प्रतिनिधित्व करने, मैं \n का उपयोग करें। उदाहरण के लिए:गो/गोलांग में एक नई लाइन का प्रतिनिधित्व करने के लिए सबसे पोर्टेबल/क्रॉस-प्लेटफ़ॉर्म तरीका क्या है?

package main 

import "fmt" 


func main() { 
    fmt.Printf("%d is %s \n", 'U', string(85)) 
} 

... 85 is U उपज के बाद एक नई लाइन प्राप्त करेगा।

बहरहाल, यह है कि सभी पार मंच प्रतीत नहीं होता। अन्य भाषाओं को देखते हुए, PHP वैश्विक स्थिरता (PHP_EOL) के साथ इसका प्रतिनिधित्व करता है। \n गो/गोलांग में क्रॉस-प्लेटफॉर्म विशिष्ट तरीके से न्यूलाइन का प्रतिनिधित्व करने का सही तरीका है?

उत्तर

15

के बारे में मैं यह इतना देखने के लिए वास्तव में क्या fmt.Println द्वारा किया जाता है का फैसला किया उत्सुक हो गया। http://golang.org/src/pkg/fmt/print.go

यदि आप बहुत नीचे स्क्रॉल करते हैं, तो आपको if addnewline दिखाई देगा जहां \n हमेशा उपयोग किया जाता है। मैं शायद ही अगर यह यह करने का सबसे "पार मंच" तरीका है के लिए बात कर सकते हैं नहीं है, और जाना मूल रूप से शुरुआती दिनों में Linux में बंधा हुआ था, लेकिन जहां यह एसटीडी lib के लिए है कि है।

मैं मूल रूप से सिर्फ fmt.Fprintln उपयोग करने का सुझाव लिए जा रहा था और यह अभी भी मान्य हो सकता है, जैसे वर्तमान कार्यक्षमता उपयुक्त नहीं है, एक बग दायर किया जा सकता है और उसके बाद कोड बस नवीनतम जाओ toolchain के साथ संकलित करने की आवश्यकता होगी।

+0

यह है करने के लिए "\ n" ठीक है कुछ उत्पादन के लिए सीधे मुद्रित करने के लिए जब यह आउटपुट स्ट्रीम गैर-बाइनरी होती है तो न्यूलाइन अनुवाद की वजह से स्ट्रीम सक्षम होता है। यह सी रनटाइम लाइब्रेरी की एक संपत्ति है जिस पर गो आधारित है: यह प्लेटफ़ॉर्म द्वारा उपयोग किए जाने वाले लाइन अंतराल को स्वचालित रूप से परिवर्तित करता है, इसलिए प्रोग्राम कोड में केवल "\ n" का उपयोग करना सुरक्षित है। यह केवल गैर-बाइनरी धाराओं के लिए काम करता है, और केवल सी रनटाइम का उपयोग करके प्लेटफ़ॉर्म लाइन विभाजक (जैसे स्ट्रिंग के रूप में) प्राप्त करना आसान नहीं होगा। –

+4

@VladimirMatveev, क्या आप निश्चित रूप से सी रनटाइम पर आधारित हैं? ऐसा लगता है कि इसके मानक कंपाइलर सी रनटाइम पर निर्भर नहीं हैं और स्थिर रूप से जुड़ी बाइनरी उत्पन्न करते हैं जो किसी भी चीज़ पर निर्भर नहीं हैं। – kostix

+1

@ कोस्टिक्स, ऐसा लगता है कि आप सही हैं। गो I/O मशीनरी के आंतरिक माध्यमों को देखते हुए सुझाव मिलता है कि वे फ़ाइलों को खोलने के लिए यूनिक्स सिस्टम पर POSIX 'open()' syscall और Windows सिस्टम पर 'CreateFile' का उपयोग कर रहे हैं। 'Os.File # लिखें' को प्रदान किया गया बफर विंडोज़ 'लिखितफाइल' एपीआई फ़ंक्शन पर सीधे अपरिवर्तित भेजा जाता है। विंडोज एपीआई फ़ंक्शन लाइन एंडिंग रूपांतरण नहीं करते हैं, इसलिए स्रोत में केवल एलएफ होने पर आउटपुट में केवल एलएफ होगा। –

10

होने ओएस निर्धारित न्यू लाइन चरित्र है कई संदर्भों में होता है गलत हो सकता है। आप वास्तव में जानना चाहते हैं कि "रिकॉर्ड" सेपरेटर क्या है और गो मानते हैं कि प्रोग्रामर के रूप में आपको यह पता होना चाहिए।

खिड़कियों पर बाइनरी रन वो यूनिक्स ऑपरेटिंग सिस्टम से एक फ़ाइल लेने वाली हो सकता है यहां तक ​​कि अगर

लाइन अंत क्या फ़ाइल या दस्तावेज़ के स्रोत ने कहा कि एक लाइन नहीं खत्म होने वाली ओएस बाइनरी में चल रहा है था द्वारा निर्धारित किया जाता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^