মডিউল পাঠ (3/5)
`io` এবং `os`: ফাইল এবং স্ট্রীম
Go-তে ফাইল এবং স্ট্রীম পড়া এবং লেখা দুটি পরিপূরক প্যাকেজের চারপাশে ঘোরে: 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.O_APPEND | os.O_CREATE | os.O_WRONLY এর মত পতাকা সহ os.OpenFile(path, flag, perm) ব্যবহার করুন।
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) পাস করতে পারেন, একটি ডিকম্প্রেসারের জন্য একই রকম।
// 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 থেকে:
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 গ্রহণ করা হয় আপনি সেগুলি পাস করতে পারেন৷
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-এ PROGRAM NAME-এর সূচক কী?
fmt.Println(os.Args[???])