내보내지 않은 필드가 있는 구조체로 작업할 때 이를 이진 데이터로 인코딩하는 것이 어려울 수 있습니다. 인코딩/바이너리 패키지가 솔루션을 제공하지만 리플렉션에 의존하면 내보내지 않은 필드에 문제가 발생할 수 있습니다.
대체 솔루션
이 제한을 극복하려면 고브 패키지. gob 패키지는 개인 필드가 있는 경우에도 데이터 구조를 직렬화 및 역직렬화하는 간단하고 효율적인 방법을 제공합니다. 구현 방법은 다음과 같습니다.
예
다음 예제 코드를 고려하세요.
package main import ( "bytes" "encoding/gob" "fmt" ) type Data struct { id int32 name [16]byte } func (d *Data) GobEncode() ([]byte, error) { w := new(bytes.Buffer) enc := gob.NewEncoder(w) err := enc.Encode(d.id) if err != nil { return nil, err } err = enc.Encode(d.name) if err != nil { return nil, err } return w.Bytes(), nil } func (d *Data) GobDecode(buf []byte) error { r := bytes.NewBuffer(buf) dec := gob.NewDecoder(r) err := dec.Decode(&d.id) if err != nil { return err } return dec.Decode(&d.name) } func main() { d := Data{id: 7} copy(d.name[:], []byte("tree")) buffer := new(bytes.Buffer) // Write enc := gob.NewEncoder(buffer) err := enc.Encode(d) if err != nil { fmt.Println("Encode error:", err) return } // Read buffer = bytes.NewBuffer(buffer.Bytes()) e := new(Data) dec := gob.NewDecoder(buffer) err = dec.Decode(e) if err != nil { fmt.Println("Decode error:", err) return } fmt.Println(e) }
이 접근 방식을 따르면 효과적으로 덤프하고 검색할 수 있습니다. 리플렉션에 의존하지 않고 내보내지 않은 필드가 있는 데이터를 바이트 배열로 구조화합니다.
위 내용은 내보내지 않은 필드가 있는 구조체를 리플렉션 없이 바이트 배열로 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!