لماذا "مجرد طباعة هيكل" في Go ليس بهذه البساطة؟
\n\nتخيل: أنت تكتب بلغة Go، وأنشأت هيكلاً جميلاً User، وملأته بالبيانات، وتريد فقط إلقاء نظرة على ما بداخله. تكتب fmt.Println(user) وترى شيئًا مثل {Alex 25 true}. هل هذا مفيد؟ ليس كثيرًا. ماذا لو كان هناك 15 حقلًا؟ ماذا لو كان أحدها هيكلاً متداخلاً؟ ماذا لو كان شريحة من الهياكل؟
سؤال "How to print struct variables in console?" على Stack Overflow حصل على آلاف المشاهدات ليس من قبيل الصدفة. كل مبتدئ (وليس فقط) في Golang يواجه حقيقة أن الإخراج القياسي للهياكل هو سلسلة مملة بدون أسماء الحقول. وعندما يكبر المشروع، يتحول التصحيح إلى تخمين.
\n\nفي هذه المقالة، سنناقش جميع طرق إخراج الهياكل في وحدة تحكم Go: من الأساسية إلى المتقدمة. ستتعلم كيفية إخراج هيكل بشكل جميل، مع أسماء الحقول، على شكل JSON، وحتى كيفية كتابة طريقتك الخاصة للطباعة. هيا بنا!
\n\n▎1. أبسط طريقة: fmt.Println وقيوده
\n\nلنبدأ من الأساس. لدينا هيكل:
\n\npackage main\n\nimport "fmt"\n\ntype User struct {\n Name string\n Age int\n Active bool\n}\n\nfunc main() {\n u := User{Name: "آنا", Age: 30, Active: true}\n fmt.Println(u)\n}\n\n\nالإخراج:\n
{آنا 30 true}\n\nيعمل، لكنه غير مفيد. لا ترى أي قيمة تنتمي إلى أي حقل. إذا كان في الهيكل 10 حقول، ستخمن ما هو ماذا. خاصة إذا تكرر نوع البيانات (مثل حقلين من نوع string متتاليين).
الخلاصة: fmt.Println يصلح فقط للفحص السريع عندما يكون الهيكل صغيرًا وتتذكر بالضبط ترتيب الحقول.
متى يكون هذا مفيدًا؟
\n- \n
- أنت تكتب سكريبتًا لاستخدام واحد. \n
- الهيكل يحتوي على 2-3 حقول من أنواع مختلفة. \n
- أنت تستخدم
fmt.Printlnللسجلات حيث السرعة مهمة وليس سهولة القراءة. \n
▎2. %+v المنقذ: الطباعة بأسماء الحقول
\n\nهذه، على الأرجح، الإجابة الأكثر شيوعًا على Stack Overflow. التنسيق %+v في fmt.Printf يخرج الهيكل بأسماء الحقول:
fmt.Printf("%+v\\n", u)\n\n\nالإخراج:\n
{Name:آنا Age:30 Active:true}\n\nأفضل بكثير الآن! ترى بوضوح أين الاسم والعمر والحالة.
\n\nماذا أيضًا في ترسانة fmt؟
\n- \n
%v— التمثيل القياسي (كما في Println). \n %+v— مع أسماء الحقول. \n %#v— تمثيل كامل مع ذكر الحزمة والنوع (انظر أدناه). \n %T— يخرج فقط نوع المتغير. \n
مثال مع %#v:
fmt.Printf("%#v\\n", u)\n// main.User{Name:"آنا", Age:30, Active:true}\n\n\nهذا التنسيق مفيد عندما تريد نسخ الإخراج ولصقه مرة أخرى في الكود — فهو تهيئة حرفية صالحة للهيكل.
\n\nنصيحة: احفظ تركيبة %+v — إنها خبزك اليومي عند تصحيح أخطاء الهياكل في Go.
▎3. الجمال والنظام: التسلسل إلى JSON
\n\nعندما يكون الهيكل كبيرًا أو متداخلاً أو يحتوي على شرائح، قد يصبح %+v غير قابل للقراءة. هنا يأتي JSON للإنقاذ. Go قادر بشكل قياسي على تحويل الهيكل إلى JSON:
package main\n\nimport (\n "encoding/json"\n "fmt"\n)\n\ntype Address struct {\n City string `json:"city"`\n Street string `json:"street"`\n}\n\ntype User struct {\n Name string `json:"name"`\n Age int `json:"age"`\n Active bool `json:"active"`\n Address Address `json:"address"`\n}\n\nfunc main() {\n u := User{\n Name: "إيفان",\n Age: 28,\n Active: true,\n Address: Address{\n City: "موسكو",\n Street: "تفيرسكايا",\n }