package
0.0.0-20240927143213-b11bb4fab650
Repository: https://github.com/jocelynh1110/go-practice.git
Documentation: pkg.go.dev

# README

11-6 gob:Go 自有的編碼格式

  • 以純文字為基礎的格式在解讀上仍然慢了點。例、JSON、XML。
  • 若系統完全以 Go 語言撰寫,那可以改用 Go 語言自己的二進位編碼格式—— gob。
  • Go 語言設計 gob 時,是以高效率、簡單易用和完整為考量,不需額外設定,甚至收發雙方使用的 Go 結構也不見得需要相同。
  • Go 1.16 下 gob 解碼及編碼的所需時間只有 JSON 的三分之一。

gob 套件用起來和 json 的 Encoder/Decoder 很像:

func NewEncoder(w io.Writer) *Encoder
func NewDecoder(r io.Reader) *Decoder
func (enc *Encoder) Encode(e interface{}) error
func (dev *Decoder) Decode(e interface{}) error

練習、使用 gob 編碼和解碼資料

package main

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

type student struct {
	StudentId     int
	LastName      string
	MiddleInitial string
	FirstName     string
	IsEnrolled    bool
	Courses       []course
}

type course struct {
	Name   string
	Number int
	Hours  int
}

func main() {
	// 原始資料
	s := student{
		StudentId:  2,
		LastName:   "Fu",
		FirstName:  "Sala",
		IsEnrolled: true,
		Courses: []course{
			{Name: "English", Number: 203, Hours: 2},
			{Name: "History", Number: 304, Hours: 2},
			{Name: "Math", Number: 102, Hours: 3},
		},
	}

	var conn bytes.Buffer            // 模擬通訊用的 io.Reader/io.Writer
	encoder := gob.NewEncoder(&conn) // 產生 encoder
	if err := encoder.Encode(&s); err != nil {
		fmt.Println("GOB 編碼錯誤:", err)
		os.Exit(1)
	}

	fmt.Printf("%x\n", conn.String()) // 把 conn 的內容用 16 進位形式印出

	s2 := student{}                             // 接收解碼後資料的結構
	decoder := gob.NewDecoder(&conn)            // 產生 decoder
	if err := decoder.Decode(&s2); err != nil { // 解碼 gob
		fmt.Println("GOB 解碼錯誤:", err)
		os.Exit(1)
	}
	fmt.Println(s2) // 解碼後的資料
}

顯示結果:

6b7f0301010773747564656e7401ff80000106010953747564656e74496401040001084c6173744e616d65010c00010d4d6964646c65496e697469616c010c00010946697273744e616d65010c00010a4973456e726f6c6c65640102000107436f757273657301ff840000001cff830201010d5b5d6d61696e2e636f7572736501ff840001ff82000032ff8103010106636f7572736501ff8200010301044e616d65010c0001064e756d6265720104000105486f75727301040000003fff80010401024675020453616c61010101030107456e676c69736801fe01960104000107486973746f727901fe026001040001044d61746801ffcc01060000
{2 Fu  Sala true [{English 203 2} {History 304 2} {Math 102 3}]}