إخراج الهياكل في Go: من المبتدئ إلى المحترف في 10 دقائق

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا "مجرد طباعة هيكل" في Go ليس بهذه البساطة؟

\n\n

تخيل: أنت تكتب بلغة Go، وأنشأت هيكلاً جميلاً User، وملأته بالبيانات، وتريد فقط إلقاء نظرة على ما بداخله. تكتب fmt.Println(user) وترى شيئًا مثل {Alex 25 true}. هل هذا مفيد؟ ليس كثيرًا. ماذا لو كان هناك 15 حقلًا؟ ماذا لو كان أحدها هيكلاً متداخلاً؟ ماذا لو كان شريحة من الهياكل؟

\n\n

سؤال "How to print struct variables in console?" على Stack Overflow حصل على آلاف المشاهدات ليس من قبيل الصدفة. كل مبتدئ (وليس فقط) في Golang يواجه حقيقة أن الإخراج القياسي للهياكل هو سلسلة مملة بدون أسماء الحقول. وعندما يكبر المشروع، يتحول التصحيح إلى تخمين.

\n\n

في هذه المقالة، سنناقش جميع طرق إخراج الهياكل في وحدة تحكم Go: من الأساسية إلى المتقدمة. ستتعلم كيفية إخراج هيكل بشكل جميل، مع أسماء الحقول، على شكل JSON، وحتى كيفية كتابة طريقتك الخاصة للطباعة. هيا بنا!

\n\n

▎1. أبسط طريقة: fmt.Println وقيوده

\n\n

لنبدأ من الأساس. لدينا هيكل:

\n\n
package 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 متتاليين).

\n\n

الخلاصة: fmt.Println يصلح فقط للفحص السريع عندما يكون الهيكل صغيرًا وتتذكر بالضبط ترتيب الحقول.

\n\n

متى يكون هذا مفيدًا؟

\n
    \n
  • أنت تكتب سكريبتًا لاستخدام واحد.
  • \n
  • الهيكل يحتوي على 2-3 حقول من أنواع مختلفة.
  • \n
  • أنت تستخدم fmt.Println للسجلات حيث السرعة مهمة وليس سهولة القراءة.
  • \n
\n\n

▎2. %+v المنقذ: الطباعة بأسماء الحقول

\n\n

هذه، على الأرجح، الإجابة الأكثر شيوعًا على Stack Overflow. التنسيق %+v في fmt.Printf يخرج الهيكل بأسماء الحقول:

\n\n
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
\n\n

مثال مع %#v:

\n
fmt.Printf("%#v\\n", u)\n// main.User{Name:"آنا", Age:30, Active:true}\n
\n\n

هذا التنسيق مفيد عندما تريد نسخ الإخراج ولصقه مرة أخرى في الكود — فهو تهيئة حرفية صالحة للهيكل.

\n\n

نصيحة: احفظ تركيبة %+v — إنها خبزك اليومي عند تصحيح أخطاء الهياكل في Go.

\n\n

▎3. الجمال والنظام: التسلسل إلى JSON

\n\n

عندما يكون الهيكل كبيرًا أو متداخلاً أو يحتوي على شرائح، قد يصبح %+v غير قابل للقراءة. هنا يأتي JSON للإنقاذ. Go قادر بشكل قياسي على تحويل الهيكل إلى JSON:

\n\n
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        }                

المدونات

توصيات الكتب