মূল কন্টেন্টে যান
মডিউল 8 · 3-এর পাঠ 5কোর্সে 38/50~14 min
মডিউল পাঠ (3/5)

`io` এবং `os`: ফাইল এবং স্ট্রীম

Go-তে ফাইল এবং স্ট্রীম পড়া এবং লেখা দুটি পরিপূরক প্যাকেজের চারপাশে ঘোরে: 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.O_APPEND | os.O_CREATE | os.O_WRONLY এর মত পতাকা সহ os.OpenFile(path, flag, perm) ব্যবহার করুন।

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) পাস করতে পারেন, একটি ডিকম্প্রেসারের জন্য একই রকম।

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.File: যেখানেই একটি 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-এ PROGRAM NAME-এর সূচক কী?

Go
fmt.Println(os.Args[???])
উত্তরের বিকল্প