मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 3 का 5पाठ्यक्रम में 38/50~14 min
मॉड्यूल पाठ (3/5)

`io` और `os`: फ़ाइलें और स्ट्रीम

गो में फ़ाइलों और स्ट्रीम को पढ़ना और लिखना दो पूरक पैकेजों के आसपास घूमता है: os (उद्घाटन, निर्माण, मेटाडेटा, प्रक्रियाएं) और io (Reader/Writer इंटरफ़ेस जो किसी भी बाइट स्रोत को अमूर्त करते हैं)।

फ़ाइलें पढ़ना और लिखना: शॉर्टकट

छोटी या कॉन्फ़िगरेशन फ़ाइलों के लिए, एक कॉल पर्याप्त है:

Go
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 से बंद करें:

Go
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: सार्वभौमिक इंटरफ़ेस

Go
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 के लिए भी लागू होती है।

Go
// 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 से:

Go
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 स्वीकार किए जाते हैं, आप उन्हें पास कर सकते हैं।

Go
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin)  // echo

अभ्यास

व्यायाम#go.m8.l3.e1
प्रयास: 0लोड हो रहा है...

पहला कमांड-लाइन तर्क प्रिंट करें (os.Args[1])। यदि यह गायब है, तो 'मैनका आर्गोमेंटो' प्रिंट करें और वापस लौटें।

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m8.l3.e2
प्रयास: 0लोड हो रहा है...

os.WriteFile (अनुमतियाँ 0644) के साथ 'out.txt' फ़ाइल में स्ट्रिंग 'ciao' लिखें। त्रुटि को संभालें.

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m8.l3.e3
तैयार

os.Args में प्रोग्राम नाम का सूचकांक क्या है?

Go
fmt.Println(os.Args[???])
उत्तर विकल्प