리플렉션 없이 구조체를 바이트 배열로 덤프하려면 어떻게 해야 하나요?
이미 인코딩/바이너리 패키지를 접했을 수도 있지만 이는 다음 사항에 의존합니다. 대문자로 표시되지 않은(내보내지 않은) 구조체를 처리할 때 문제를 일으키는 Reflect 패키지 fields.
대체 솔루션: gob 패키지 활용
이 제한을 피하려면 gob 패키지 활용을 고려하세요. GobDecoder 및 GobEncoder 인터페이스를 구현하면 비공개 필드를 안전하고 효율적으로 직렬화 및 역직렬화할 수 있습니다. 이 접근 방식은 플랫폼 독립적이며 내보내지 않은 필드가 있는 구조체에 해당 함수를 추가하기만 하면 되며 나머지 코드는 깔끔하게 유지됩니다.
구현 예
다음 방법을 따르세요. GobEncode 및 GobDecode 메소드를 구현하십시오.
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) }
기본 기능에서 gob 패키지를 사용하여 구조체를 쓰고 읽을 수 있습니다:
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) }
위 내용은 Go에서 리플렉션 없이 내보내지 않은 필드가 있는 구조체를 바이트 배열로 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!