Heim > Backend-Entwicklung > Golang > Wie speichere ich Strukturen mit nicht exportierten Feldern ohne Reflection in Byte-Arrays in Go?

Wie speichere ich Strukturen mit nicht exportierten Feldern ohne Reflection in Byte-Arrays in Go?

DDD
Freigeben: 2024-11-29 08:05:10
Original
472 Leute haben es durchsucht

How to Dump Structs with Unexported Fields into Byte Arrays in Go without Reflection?

Struktur ohne Reflexion in Byte-Array ausgeben

Die Frage ergibt sich aus einem Problem, das bei der Verwendung des Codierungs-/Binärpakets zum Speichern von Strukturen in Byte auftritt Arrays. Da das Paket auf Reflektion basiert, kann es nicht exportierte (nicht großgeschriebene) Strukturfelder nicht verarbeiten. Die Sorge ergibt sich aus dem Versuch, die Abstraktion bestimmter Datenstrukturen aufrechtzuerhalten.

Lösung

Um Strukturen mit nicht exportierten Feldern ohne Reflektion in Byte-Arrays abzulegen, sollten Sie den Einsatz des Gob in Betracht ziehen Paket. Dieses Paket bietet effiziente und plattformunabhängige Serialisierungs- und Deserialisierungsfunktionen. Durch die Implementierung der GobEncoder- und GobDecoder-Schnittstellen für Strukturen mit nicht exportierten Feldern können Sie deren Inhalte effektiv serialisieren und deserialisieren.

Unten ist ein Beispiel, das die Verwendung des gob-Pakets demonstriert:

package main

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

type Data struct {
    id   int32
    name [16]byte
}

func (d *Data) GobEncode() ([]byte, error) {
    w := new(bytes.Buffer)
    encoder := gob.NewEncoder(w)
    err := encoder.Encode(d.id)
    if err != nil {
        return nil, err
    }
    err = encoder.Encode(d.name)
    if err != nil {
        return nil, err
    }
    return w.Bytes(), nil
}

func (d *Data) GobDecode(buf []byte) error {
    r := bytes.NewBuffer(buf)
    decoder := gob.NewDecoder(r)
    err := decoder.Decode(&d.id)
    if err != nil {
        return err
    }
    return decoder.Decode(&d.name)
}

func main() {
    d := Data{id: 7}
    copy(d.name[:], []byte("tree"))
    buffer := new(bytes.Buffer)

    // Writing
    enc := gob.NewEncoder(buffer)
    err := enc.Encode(d)
    if err != nil {
        log.Fatal("encode error:", err)
    }

    // Reading
    buffer = bytes.NewBuffer(buffer.Bytes())
    e := new(Data)
    dec := gob.NewDecoder(buffer)
    err = dec.Decode(e)
    fmt.Println(e, err)
}
Nach dem Login kopieren

Von Durch die Implementierung dieser Schnittstellen können Sie nicht exportierte Strukturfelder serialisieren und deserialisieren, ohne dass eine Reflexion erforderlich ist, und so das ordnungsgemäße Dumping sicherstellen Daten in Byte-Arrays strukturieren.

Das obige ist der detaillierte Inhalt vonWie speichere ich Strukturen mit nicht exportierten Feldern ohne Reflection in Byte-Arrays in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage