طرح‌چه

تبدیل داده ها به باینری با استفاده از Gob | گولنگ به زبان ساده

۲۶ مهر ۱۴۰۴

تبدیل داده ها به باینری با استفاده از Gob | گولنگ به زبان ساده
با Gob آشنا می‌شویم و یاد می‌گیریم چطور برای تبدیل اطلاعات به فرمت باینری میتوان از Gob استفاده کنیم.

برای انتقال اطلاعات از طریق شبکه و یا ذخیره آن‌ها در یک فایل, بهتر است اطلاعات را به یک فرمت خاص انکد (encode) کرد. روش های زیادی مانند JSON, XML, Protobuffer وجود دارند اما یک روش دیگر نیز وجود دارد که توسط پکیج gob در گولنگ قابل استفاده است.

در گولنگ یک پکیج با نام gob وجود دارد که با استفاده از آن می‌توان اطلاعات را به فرمت باینری اینکد(encode) و دیکد(decode) کرد. برای برقراری ارتباط بین دو اپلیکیشن نوشته شده با Go میتوان با استفاده از gob اطلاعات را به باینری تبدیل (encode) و سپس از حالت باینری خارج کرد (decode).

این روش نسبت به روش های استاندارد مانند JSON , XML و protobuffer مزایا و معایبی دارد.

مزایای استفاده از Gob

  • داده ها به باینری تبدیل می‌شوند بنابراین دارای حجم کمتری نسبت به XML و JSON خواهند بود. در هنگام انتقال اطلاعات, هرچه حجم داده ها کمتر باشد انتقال داده ها سریعتر انجام خواهد شد.

  • پشتیبانی از ساختار های پیچیده ی Go مثل pointer, map, struct و ...

  • دارای پرفورمنس بالا و نیاز به پیاده سازی ساده

معایب استفاده از Gob

  • فقط در گولنگ قابل استفاه است بنابراین اگر اپلیکیشن های شما به زبان های مختلفی نوشته شده اند نمی‌توان از Gob به عنوان یک فرمت انتقال داده بین اپلیکیشن های خود استفاده کنید.

  • در هنگام دیکد کردن اطلاعات, هیچ اعتبار سنجی بر روی داده‌ها انجام نمی‌شود. بنابراین gob مناسب داده های ناشناس یا بدون اعتبار سنجی نیست.

نحوه استفاده از Gob

با استفاده از پکیج gob به صورت زیر می‌توانیم داده ها را به باینری تبدیل کنیم:

package main

import (
	"encoding/gob"
	"log"
	"os"
)

type Contact struct {
	Name  string
	Email string
	Phone string
}

func main() {
	// save contacts
	contactsToSave := []Contact{
		{Name: "John Doe", Email: "john.doe@example.com", Phone: "1234567890"},
		{Name: "Jane Doe", Email: "jane.doe@example.com", Phone: "0987654321"},
	}

	if err := save(contactsToSave, "contacts.gob"); err != nil {
		log.Fatal("save error:", err)
	}
}

func save(contacts []Contact, filename string) error {
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR, 0644)
	if err != nil {
		return err
	}
	defer file.Close()
	defer file.Sync()

	encoder := gob.NewEncoder(file)

	return encoder.Encode(contacts)
}

با استفاده از تابع ‍NewEncoder جایی که قرار است داده ها نوشته شوند را مشخص میکنیم و در نهایت با استفاده از تابع Encode اطلاعات را به فرمت باینری تبدیل میکنیم. در مثال بالا داده ها به صورت باینری درون فایلی با نام contacts.gob نوشته می‌شوند.

همچنین برای دیکد کردن داده ها از فرمت gob به دیتاهای درون گولنگ می‌تونیم به صورت زیر عمل کنیم:

package main

import (
	"encoding/gob"
	"log"
	"os"
)

type Contact struct {
	Name  string
	Email string
	Phone string
}

func main() {
	// load contacts
	var contactsToLoad []Contact

	if err := load("contacts.gob", &contactsToLoad); err != nil {
		log.Fatal("load error:", err)
	}

	log.Println("contacts:", contactsToLoad)
}

func load(filename string, contacts *[]Contact) error {
	file, err := os.OpenFile(filename, os.O_RDONLY, 0644)
	if err != nil {
		return err
	}
	defer file.Close()

	decoder := gob.NewDecoder(file)

	return decoder.Decode(contacts)
}

در مثال بالا اطلاعاتی که با فرمت باینری در فایل contacts.gob ذخیره شده اند را دیکد و درون contactsToLoad قرار می‌دهیم و در نهایت در خروجی استاندارد چاپ می‌کنیم.

محتوای این پست بر اساس منابع زیر نوشته شده است:

کدهای مرتبط با این پست را می‌توانید درون رپازیتوری گیت هاب ما پیدا کنید.


قسمت قبل: جی‌سان (JSON) | گولنگ به زبان ساده

قسمت بعد: معرفی پکیج استاندارد RPC | گولنگ به زبان ساده


دیدگاه ها