मॉड्यूल पाठ (3/5)
`io` और `os`: फ़ाइलें और स्ट्रीम
गो में फ़ाइलों और स्ट्रीम को पढ़ना और लिखना दो पूरक पैकेजों के आसपास घूमता है: os (उद्घाटन, निर्माण, मेटाडेटा, प्रक्रियाएं) और io (Reader/Writer इंटरफ़ेस जो किसी भी बाइट स्रोत को अमूर्त करते हैं)।
फ़ाइलें पढ़ना और लिखना: शॉर्टकट
छोटी या कॉन्फ़िगरेशन फ़ाइलों के लिए, एक कॉल पर्याप्त है:
data, err := os.ReadFile("input.txt") // returns []byte
if err != nil {
return err
}
fmt.Println(string(data))
err = os.WriteFile("out.txt", []byte("ciao"), 0644)os.ReadFile खुलता है, सब कुछ मेमोरी में पढ़ता है और बंद कर देता है। कुछ एमबी तक बिल्कुल सही; इसके अलावा, स्ट्रीमिंग बेहतर है।
स्ट्रीमिंग के लिए फ़ाइलें खोलना
बड़ी फ़ाइलों या वृद्धिशील पहुंच के लिए, फ़ाइल खोलें और इसे defer से बंद करें:
f, err := os.Open("big.txt") // read-only
if err != nil {
return err
}
defer f.Close()
buf := make([]byte, 4096)
for {
n, err := f.Read(buf)
if n > 0 {
process(buf[:n])
}
if err == io.EOF {
break
}
if err != nil {
return err
}
}os.Open केवल पढ़ने के लिए खुलता है। लिखने के लिए os.Create (यदि मौजूद है तो इसे छोटा कर देता है) या os.OpenFile(path, flag, perm) जैसे झंडों के साथ os.O_APPEND | os.O_CREATE | os.O_WRONLY का उपयोग करें।
io.Reader और io.Writer: सार्वभौमिक इंटरफ़ेस
type Reader interface { Read(p []byte) (n int, err error) }
type Writer interface { Write(p []byte) (n int, err error) }जहां भी मानक लाइब्रेरी io.Reader स्वीकार करती है, आप एक फ़ाइल (*os.File), एक स्ट्रिंग (strings.NewReader), एक *bytes.Buffer, एक HTTP प्रतिक्रिया (resp.Body), एक डीकंप्रेसर पास कर सकते हैं... यही बात io.Writer के लिए भी लागू होती है।
// Copy from a Reader to a Writer (e.g. download → file).
n, err := io.Copy(dst, src)io.Copy बाइट पाइपलाइनों के लिए वर्कहॉर्स है: यह बफरिंग और EOF को सही ढंग से संभालता है। io.ReadAll(r) EOF तक सब कुछ []byte में पढ़ता है।
os.Args: सीएलआई तर्क
os.Args स्ट्रिंग्स का एक टुकड़ा है: इंडेक्स 0 प्रोग्राम का नाम है, वास्तविक तर्कों पर 1 से:
func main() {
if len(os.Args) < 2 {
fmt.Fprintln(os.Stderr, "uso: prog <nome>")
os.Exit(1)
}
fmt.Println("ciao", os.Args[1])
}अधिक संरचित पार्सिंग (झंडे, डिफ़ॉल्ट, सहायता) के लिए stdlib या cobra जैसी बाहरी लाइब्रेरी से flag पैकेज का उपयोग करें।
os.Stdin, os.Stdout, os.Stderr
ये तीन वैश्विक *os.Files हैं: जहां भी io.Reader या io.Writer स्वीकार किए जाते हैं, आप उन्हें पास कर सकते हैं।
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin) // echoअभ्यास
पहला कमांड-लाइन तर्क प्रिंट करें (os.Args[1])। यदि यह गायब है, तो 'मैनका आर्गोमेंटो' प्रिंट करें और वापस लौटें।
3 प्रयासों के बाद समाधान उपलब्ध है
os.WriteFile (अनुमतियाँ 0644) के साथ 'out.txt' फ़ाइल में स्ट्रिंग 'ciao' लिखें। त्रुटि को संभालें.
3 प्रयासों के बाद समाधान उपलब्ध है
os.Args में प्रोग्राम नाम का सूचकांक क्या है?
fmt.Println(os.Args[???])