1. آپریشن سسٹم کتابخانے کی بنیادیں

Golang میں os پیکیج، آپریٹنگ سسٹم کے فعلوں کے لئے ایک پلیٹ فارم آفہ انٹرفیس فراہم کرتا ہے۔ اگلے، ہم بات کریں گے کہ 'os' پیکیج کو فائل کھولنے، بند کرنے، پڑھنے، لکھنے کے عملوں کو کیسے استعمال کیا جاتا ہے، اور فائل کے اراکین حاصل کرنے اور مختص کرنے کا طر یقہ کیسے کیا جاتا ہے۔

1.1 فائل کھولنا اور بند کرنا

Go زبان میں، آپ os.Open فنکشن کا استعمال کرکے فائل کھول سکتے ہیں، جو ایک *os.File آبجیکٹ اور ایک خرابی واپس کرے گا۔ جب فائل کھولی جائے، آپ پڑھنے، لکھنے، اور دیگر عمل کرسکتے ہیں۔ عمل کرنے کے بعد، آپ کو file.Close کو بلند کرنے اور متعلقہ وسائل کو رہا کرنے کے لئے فون کرنا چاہئے۔

یہاں ایک فائل کھولنے کا مثال ہے:

package main

import (
    "fmt"
    "os"
)

func main() {
    // موجودہ ڈائریکٹری میں فائل test.txt کھولیں
    file, err := os.Open("test.txt")
    if err != nil {
        // فائل کھولنے کی خرابی کا سامنا کریں
        fmt.Println("Error opening file:", err)
        return
    }
    // یہ اطمینان دینے کے لئے کہ فائل آخر میں بند ہوجائے گی
    defer file.Close()

    // فائل کے کارروائی کی عملیات...

    fmt.Println("فائل کامیابی کے ساتھ کھولی گئی")
}

موجودہ کوڈ میں، ہم نے defer فرمان استعمال کیا ہے تاکہ file.Close کو فوراً اجراء کیا جائے۔ یہ Go زبان میں وسائل کو صاف کرنے کا عام عمل ہے۔

1.2 فائل پڑھنے اور لکھنے کی کارروائیاں

os.File قسم کے پاس Read اور Write میتھڈ ہوتے ہیں، جو فائل کے پڑھنے اور لکھنے کی کارروائیوں کے لئے استعمال کیا جا سکتا ہے۔ Read میتھڈ فائل سے ڈیٹا کو ایک بائٹ سلائس میں پڑھتا ہے، اور Write میتھڈ فائل سے بائٹ سلائس میں ڈیٹا لکھتا ہے۔

نیچے دی گئی مثال میں دکھایا گیا ہے کہ فائل سے پڑھنے اور لکھنے کس طرح کیا جاتا ہے:

package main

import (
    "fmt"
    "os"
)

func main() {
    // فائل کھولیں
    file, err := os.OpenFile("test.txt", os.O_RDWR, 0644)
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()

    // فائل مواد لکھیں
    message := []byte("ہیلو، گوفرز!")
    _, writeErr := file.Write(message)
    if writeErr != nil {
        fmt.Println("فائل میں لکھنے میں خرابی:", writeErr)
        return
    }

    // فائل کو شروع سے پڑھیں
    file.Seek(0, 0)
    buffer := make([]byte, len(message))
    _, readErr := file.Read(buffer)
    if readErr != nil {
        fmt.Println("فائل پڑھنے میں خرابی:", readErr)
        return
    }

    fmt.Println("فائل مواد:", string(buffer))
}

اس مثال میں، ہم نے os.Open کی بجائے os.OpenFile کا استعمال کیا ہے۔ os.OpenFile فنکشن آپ کو فائل کھولنے کے وقت استعمال ہونے والے موڈ اور اجازت کا مقرر کرنے کی اجازت دیتا ہے۔ یہاں کی مثال میں، os.O_RDWR جھنڈا استعمال ہوا ہے، یعنی فائل کو پڑھنے، لکھنے کے موڈ میں کھولا جائے گا۔

1.3 فائل کی خصوصیات اور اجازتیں

آپ os پیکیج کے فنکشن استعمال کرکے فائل کی حالت کی معلومات تک رسائی حاصل کرنے اور تبدیل کرنے کے لئے استعمال کرسکتے ہیں۔ os.Stat یا os.Lstat کا استعمال کرکے آپ os.FileInfo انٹرفیس حاصل کرسکتے ہیں، جو فائل کی معلومات فراہم کرتا ہے، مثلاً سائز، اجازتیں، ترتیبی وقت تبدیلی، اور مزید۔

یہاں فائل کی حالت حاصل کرنے کا ایک مثال ہے:

package main

import (
    "fmt"
    "os"
)

func main() {
    fileInfo, err := os.Stat("test.txt")
    if err != nil {
        fmt.Println("فائل کی معلومات حاصل کرنے میں خرابی:", err)
        return
    }

    // فائل کا سائز چھاپیں
    fmt.Printf("فائل کا سائز: %d بائٹس\n", fileInfo.Size())

    // فائل کی اجازتیں چھاپیں
    fmt.Printf("فائل کی اجازتیں: %s\n", fileInfo.Mode())
}

اگر آپ کو فائل کا نام تبدیل کرنا ہو یا فائل کی اجازتیں تبدیل کرنی ہوں تو، آپ os.Rename کا استعمال کرکے فائل کا نام تبدیل کرسکتے ہیں یا os.Chmod کا استعمال کرکے فائل کی اجازتیں تبدیل کرسکتے ہیں۔

package main

import (
    "fmt"
    "os"
)

func main() {
    // فائل کی اجازتیں صرف پڑھنے کے لئے تبدیل کریں
    err := os.Chmod("test.txt", 0444)
    if err != nil {
        fmt.Println("فائل کی اجازتیں تبدیل کرنے میں خرابی:", err)
        return
    }

    // فائل کا نام تبدیل کریں
    renameErr := os.Rename("test.txt", "renamed.txt")
    if renameErr != nil {
        fmt.Println("فائل کا نام تبدیل کرنے میں خرابی:", renameErr)
        return
    }
    
    fmt.Println("فائل کارروائی کامیاب ہوگئی")
}

یہاں، ہم test.txt فائل کی اجازتیں کو صرف پڑھنے کے لئے تبدیل کرتے ہیں، اور پھر فائل کا نام renamed.txt کرتے ہیں۔ دھیان دیں کہ جب فائل کی اجازتیں تبدیل کرتے وقت، ہوشیار رہیں، کیونکہ غلط اجازتیں سیٹ کرنے سے غیر قابل رسائی فائلوں کا سامنا ہوسکتا ہے۔

2. IO لائبریری کا بنیادی استعمال

Go زبان میں io لائبریری بنیادی I/O (داخلی / خارجی عملیات) کے انٹرفیس فراہم کرتی ہے۔ io لائبریری کا تصمیم سادگی اور یکسان انٹرفیس کے اصولوں پر مبنی ہے، ہمیں مختلف قسم کی I/O عملیات، مثلاً فائل پڑھنا / لکھنا، نیٹ ورک کمیونیکیشن، ڈیٹا بفرینگ، اور مزید کی بنیادی حمایت فراہم کرتی ہے۔

2.2 ریڈر اور رائٹر انٹرفیسز کا استعمال

io.Reader اور io.Writer دو بنیادی انٹرفیس ہیں جو کسی اشیاء کی پڑھائی اور لکھائی کی عملیات کی وضاحت دینے کے لئے استعمال ہوتے ہیں۔ یہ مختلف قسم کی اشیاء، مثلاً فائلیں، نیٹ ورک کنیکشنز، اور بفرز کی بنیاد پر بنائے جاتے ہیں۔

io.Reader

io.Reader انٹرفیس کے پاس Read میتھڈ ہوتی ہے:

Read(p []byte) (n int, err error)

یہ میتھڈ io.Reader سے p میں ہوسکنے والے len(p) بائٹس کی ڈیٹا کو پڑھتا ہے۔ یہ واپسی میتھڈ پڑھی ہوئی بائٹس کی تعداد n (0 <= n <= len(p)) اور کوئی بھی خرابی کو متاثر کرنے والی بات ہوتی ہے۔

مثالی کوڈ:

package main

import (
    "fmt"
    "io"
    "strings"
)

func main() {
    r := strings.NewReader("Hello, World!")

    buf := make([]byte, 4)
    for {
        n, err := r.Read(buf)
        if err == io.EOF {
            break
        }
        fmt.Printf("پڑھی گئی بائٹس: %d, مواد: %s\n", n, buf[:n])
    }
}

اس مثال میں ہم ایک strings.NewReader بناتے ہیں تاکہ ایک سٹرنگ سے ڈیٹا پڑھا جا سکے، اور پھر 4 بائٹ کی چنڪس میں ڈیٹا کو پڑھتے ہیں۔

io.Writer

io.Writer انٹرفیس کے پاس Write میتھڈ ہوتی ہے:

Write(p []byte) (n int, err error)

یہ میتھڈ p سے ڈیٹا کو اسکی بنیاد پر دی گئی ڈیٹا سٹریم میں لکھتی ہے، اور واپسی میتھڈ لکھی گئی بائٹس اور کسی بھی خرابی کو متاثر کرنے والی بات ہوتی ہے۔

مثالی کوڈ:

package main

import (
    "fmt"
    "os"
)

func main() {
    data := []byte("Hello, World!\n")
    n, err := os.Stdout.Write(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("لکھی گئی بائٹس: %d\n", n)
}

اس مثال میں ہم ایک سادہ سی سٹرنگ کو معیاری خروجی os.Stdout میں لکھتے ہیں، جو io.Writer کی تنسیلہ کا کردار ادا کرتا ہے۔

2.3 انتہائی ترتیب دار / لکھنے کے فعل

io پیکیج مختلف عام ترکیبوں کو سادہ کرنے والے ذرائع فراہم کرتا ہے، جیسے کہ ڈیٹا کا کاپی کرنا اور مقرر شدہ مقدار ڈیٹا پڑھنا۔

کاپی فنکشن

io.Copy ایک موزوں ترکیب ہے جو بغیر کسی وسطی بفر کے io.Reader سے io.Writer میں ڈیٹا کا کاپی کرنے کیلئے استعمال ہوتا ہے۔

نمونہ کڈ:

package main

import (
    "io"
    "os"
    "strings"
)

func main() {
    r := strings.NewReader("مثال کے طور پر سادہ کاپی آپریشن")
    _, err := io.Copy(os.Stdout, r)
    if err != nil {
        panic(err)
    }
}

اس نمونے میں، ہم نے ایک سٹرنگ کو سٹینڈرڈ آؤٹپٹ میں سیدھا کاپی کیا ہے۔

ReadAtLeast فنکشن

io.ReadAtLeast فنکشن کو استعمال کیا جاتا ہے تاکہ یقینی بنایا جائے کہ کم سے کم مقررہ مقدار کی ڈیٹا ایک io.Reader سے پڑھی جائے پھر واپس دی جائے۔

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)

نمونہ کڈ:

package main

import (
    "fmt"
    "io"
    "strings"
)

func main() {
    r := strings.NewReader("گو لینگویج چائنیز ویب سائیٹ")
    buf := make([]byte, 14)
    n, err := io.ReadAtLeast(r, buf, 14)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%s\n", buf[:n])
}

اس نمونے میں، io.ReadAtLeast کو کم از کم 14 بائٹس ڈیٹا buf میں پڑھنے کی کوشش کی گئی ہے۔

یہ انتہائی ترتیب دار / لکھنے کے فعل آپ کو I/O سے متعلق کاموں کو زیادہ فعالیت سے سنبھالنے میں مدد فراہم کرتے ہیں اور مزید پیچیدہ پروگرام لوجک کے لیے مضبوط بنیاد فراہم کرتے ہیں۔