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

উন্নত `fmt`

fmt প্যাকেজ হল গো-তে সমস্ত পাঠ্য I/O-এর গেটওয়ে৷ এটি ভালভাবে জানার অর্থ হল পঠনযোগ্য লগ লেখা, তথ্যগত ত্রুটি এবং বাহ্যিক লাইব্রেরিগুলিকে অবলম্বন না করেই বাজেভাবে মানগুলি বিন্যাস করা৷

চারটি পরিবার

fmt চারটি পরিবারে ফাংশন প্রকাশ করে, উপসর্গ দ্বারা আলাদা:

  • Print* → os.Stdout (Print, Println, Printf) কে লেখেন।
  • Fprint* → যেকোনো io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)) কে লেখে।
  • Sprint* → মুদ্রণ ছাড়াই একটি স্ট্রিং প্রদান করে (Sprintf, Sprintln)।
  • Errorf → একটি বিন্যাস তৈরি করে error।
Go
fmt.Println("hello")                       // stdout
fmt.Fprintln(os.Stderr, "boom")            // stderr
s := fmt.Sprintf("[%d]", 42)               // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped error

Print এবং Println এর মধ্যে পার্থক্য হল শুধুমাত্র আর্গুমেন্ট এবং ট্রেলিং নিউলাইনের মধ্যে স্পেস: Println সবসময় \n যোগ করে, Print এর জন্য AGYTOK_INLINE_20__ AG_2 এর জন্য অনুসরণ করে না।

প্রধান ক্রিয়াপদ

ক্রিয়াএটা কি করে
%vডিফল্ট মান (কার্যকর হলে String() কল করুন)।
%+vক্ষেত্রের নাম দিয়ে গঠন করুন।
%#vসিনট্যাক্স যান (ডিবাগিং এবং স্ন্যাপশটের জন্য দরকারী)।
%Tমানের গতিশীল প্রকার।
%dবেস 10 এ পূর্ণসংখ্যা।
%b %o %x %Xবাইনারি, অক্টাল, হেক্সাডেসিমেল (ছোট হাতের/বড় হাতের)।
%f %e %gফ্লোটিং পয়েন্ট: স্থির, সূচকীয়, কমপ্যাক্ট।
%sস্ট্রিং (বা error/Stringer)।
%qগো-স্টাইল উদ্ধৃত স্ট্রিং (পলায়ন অন্তর্ভুক্ত)।
%cইউনিকোড অক্ষর (rune)।
%pহেক্সাডেসিমেলে পয়েন্টার।
%wত্রুটি মোড়ানো (শুধুমাত্র Errorf এর ভিতরে)।
Go
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p)   // {1 2}
fmt.Printf("%+v\n", p)  // {X:1 Y:2}
fmt.Printf("%#v\n", p)  // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p)   // main.Point

প্রস্থ, নির্ভুলতা, পতাকা

সংখ্যাসূচক এবং স্ট্রিং ক্রিয়াগুলি প্রস্থ এবং নির্ভুলতা গ্রহণ করে:

  • %6d → ন্যূনতম প্রস্থ 6, স্পেস সহ বাম প্যাডিং।
  • %-6d → প্রস্থ 6, ডান প্যাডিং (পতাকা -)।
  • %06d → প্রস্থ 6, 0 সহ প্যাডিং (পতাকা 0)।
  • %.2f → নির্ভুলতা 2 দশমিক সংখ্যা।
  • %8.2f → প্রস্থ 8, নির্ভুলতা 2।
Go
fmt.Printf("|%6d|\n", 42)    // |    42|
fmt.Printf("|%-6d|\n", 42)   // |42    |
fmt.Printf("|%06d|\n", 42)   // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// |    3.14|

সারিবদ্ধ টেবিলের জন্য, টেক্সট কলামের জন্য নির্দিষ্ট প্রস্থ + %-...s হল text/tabwriter এ যাওয়ার আগে সবচেয়ে সহজ প্যাটার্ন।

%w এবং ত্রুটি মোড়ানো

%w বিশেষ: এটি শুধুমাত্র fmt.Errorf-এর ভিতরে কাজ করে এবং চেইনের মূল ত্রুটিটি সংরক্ষণ করে, যাতে errors.Is এবং errors.As এটি চলতে পারে৷

Go
if _, err := os.Open(path); err != nil {
    return fmt.Errorf("read config %q: %w", path, err)
}

%v এর পরিবর্তে %w প্রিন্ট ত্রুটির বার্তা ব্যবহার করে কিন্তু চেইন ভেঙে দেয়: কোনো মোড়ক নেই, কোনো errors.Is নেই। নিয়ম: আপনি যদি চান যে কলকারী ত্রুটির ধরন বা পরিচয়টি আলাদা করতে সক্ষম হোক, তাহলে %w ব্যবহার করুন (শুধুমাত্র প্রতি Errorf একটি)।

ব্যায়াম

ব্যায়াম#go.m8.l1.e1
প্রচেষ্টা: 0লোড হচ্ছে...

পূর্ণসংখ্যা 42 থেকে '[42]' স্ট্রিং ফরম্যাট করতে fmt.Sprintf ব্যবহার করুন, তারপর এটি প্রিন্ট করুন।

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m8.l1.e2
প্রচেষ্টা: 0লোড হচ্ছে...

%+v ক্রিয়া দিয়ে struct p প্রিন্ট করুন (এতে অবশ্যই ক্ষেত্রের নাম অন্তর্ভুক্ত করা উচিত)।

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m8.l1.e3
প্রস্তুত

fmt.Errorf-এ ব্যবহৃত কোন ক্রিয়াটি errors.Is/As-এর জন্য এরর চেইন সংরক্ষণ করে?

Go
err := fmt.Errorf("read %q: ???", path, base)
উত্তরের বিকল্প