مرکزی مواد پر جائیں
ماڈیول 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 کھولتا ہے، ہر چیز کو میموری میں پڑھتا ہے اور بند ہوجاتا ہے۔ چند MB تک کامل؛ اس سے آگے، سلسلہ بندی بہتر ہے۔

سٹریمنگ کے لیے فائلیں کھول رہا ہے۔

بڑی فائلوں یا اضافی رسائی کے لیے، فائل کو کھولیں اور اسے 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)، ایک ڈیکمپریسر CTTELINE0 کے لئے ایک ہی ڈیکمپریسر جاتا ہے۔

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: CLI دلائل

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]) پرنٹ کریں۔ اگر یہ غائب ہے تو 'manca argomento' پرنٹ کریں اور واپس کریں۔

ایڈیٹر لوڈ ہو رہا ہے…

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[???])
جواب کے اختیارات