تسلسل الكائنات في Go (Golang): دليل شامل

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

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

ابدأ الدورة

تسلسل الكائنات في Go (Golang): من JSON إلى Protobuf



التسلسل (الترميز) هو عملية تحويل بنية البيانات (كائن) إلى سلسلة من البايتات لنقلها عبر الشبكة أو حفظها على القرص. العملية العكسية هي إلغاء التسلسل (فك الترميز). في Go، يتم حل هذه المهمة باستخدام حزم قياسية وحزم خارجية. دعنا نستعرض الطرق الرئيسية.



1. المكتبة القياسية: encoding/json



الطريقة الأكثر شيوعًا. للتسلسل، يتم استخدام الحزمة encoding/json.



مثال أساسي



package main

import ( "encoding/json" "fmt" "log")

type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email,omitempty"`}

func main() { user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}

// التسلسل (Marshal) jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // {"id":1,"name":"Alice","email":"alice@example.com"}

// إلغاء التسلسل (Unmarshal) var decoded User err = json.Unmarshal(jsonData, &decoded) if err != nil { log.Fatal(err) } fmt.Printf("%+v", decoded) // {ID:1 Name:Alice Email:alice@example.com}}


وسوم الهياكل الهامة

  • json:"field_name" — يحدد اسم الحقل في JSON
  • ,omitempty — يتجاوز الحقل إذا كان فارغًا (مثل سلسلة فارغة، 0، nil)
  • ,string — يفرض تمثيلًا نصيًا للحقول الرقمية
  • - — يتجاهل الحقل أثناء التسلسل


2. التسلسل إلى XML: encoding/xml



تعمل الحزمة encoding/xml بنفس المبدأ، ولكنها تستخدم وسوم XML.



package main

import ( "encoding/xml" "fmt")

type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age,attr"`}

func main() { p := Person{Name: "Bob", Age: 30} xmlData, _ := xml.MarshalIndent(p, "", " ") fmt.Println(string(xmlData)) // الإخراج: // <person age="30"> // <name>Bob</name> // </person>}


يتم دعم السمات (,attr) والعناصر المتداخلة و CDATA ومساحات الأسماء.



3. التسلسل الثنائي: encoding/gob



الحزمة gob هي تنسيق Go الخاص للتسلسل الثنائي. مثالية لتبادل البيانات بين تطبيقات Go.



package main

import ( "bytes" "encoding/gob" "fmt" "log")

type Data struct { X, Y int Label string}

func main() { var buf bytes.Buffer enc := gob.NewEncoder(&buf) data := Data{X: 10, Y: 20, Label: "test"}

// الترميز if err := enc.Encode(data); err != nil { log.Fatal(err) }

// فك الترميز var decoded Data dec := gob.NewDecoder(&buf) if err := dec.Decode(&decoded); err != nil { log.Fatal(err) } fmt.Printf("%+v", decoded) // {X:10 Y:20 Label:test}}


خصائص gob:

  • يتطلب تسجيل الأنواع مسبقًا (إذا تم استخدام الواجهات)
  • أكثر إحكاما من JSON للبيانات الثنائية
  • غير مدعوم بلغات أخرى (فقط Go)


4. Protocol Buffers (protobuf)



بروتوكول Google للتسلسل الثنائي الفعال. يتطلب تثبيت protoc والإضافة protoc-gen-go.



الخطوة 1: تعريف المخطط (user.proto)



syntax = "proto3";package main;

message User { int32 id = 1; string name = 2; string email = 3;}


الخطوة 2: توليد الكود



protoc --go_out=. user.proto
                
    
    

توصيات