GZIP Writer 종료를 연기하면 데이터가 손실될 수 있습니다
GZIP Writer는 Go에서 데이터 압축을 위해 일반적으로 사용되는 유틸리티입니다. 이 작성자에는 데이터를 플러시할 뿐만 아니라 성공적인 압축 해제에 필요한 GZIP 바닥글도 작성하는 Close 메서드가 있습니다.
특정 시나리오에서는 Close 호출이 마지막에 실행되도록 연기하고 싶은 유혹이 있습니다. 기능. 그러나 이 접근 방식은 데이터 손실을 초래할 수 있습니다.
이유를 이해하려면 다음 코드를 고려하세요.
<code class="go">func main() { data := []byte("Hello World") compressedData, err := zipData(data) if err != nil { panic(err) } uncompressedData, err := unzipData(compressedData) if err != nil { panic(err) } fmt.Println(string(uncompressedData)) }</code>
zipData 함수는 GZIP 작성기를 사용하고 unzipData 함수는 압축된 데이터를 읽습니다. :
<code class="go">func zipData(data []byte) ([]byte, error) { buf := new(bytes.Buffer) gw := gzip.NewWriter(buf) // Deferring Close here causes data loss! defer gw.Close() _, err := gw.Write(data) if err != nil { return nil, err } err = gw.Flush() if err != nil { return nil, err } return buf.Bytes(), nil }</code>
<code class="go">func unzipData(data []byte) ([]byte, error) { r := bytes.NewReader(data) gr, err := gzip.NewReader(r) if err != nil { return nil, err } defer gr.Close() uncompressed, err := ioutil.ReadAll(gr) if err != nil { return nil, err } return uncompressed, nil }</code>
zipData에서 Close 호출을 연기할 때 문제가 발생합니다. 이는 GZIP 바닥글이 작성되기 전에 함수가 반환되어 압축된 바이트 배열에서 필수 데이터가 누락됨을 의미합니다. 이 오류는 압축이 풀린 데이터를 읽으려고 할 때 예기치 않은 EOF로 나타납니다.
이 문제를 해결하려면 압축된 데이터를 반환하기 전에 GZIP 기록기의 Close 메서드를 호출해야 합니다. 이렇게 하면 바닥글이 작성되고 데이터가 완전해집니다.
<code class="go">func zipData(data []byte) ([]byte, error) { buf := new(bytes.Buffer) gw := gzip.NewWriter(buf) // Close the writer before returning defer gw.Close() _, err := gw.Write(data) if err != nil { return nil, err } err = gw.Flush() if err != nil { return nil, err } return buf.Bytes(), nil }</code>
작성기를 닫은 후 반환함으로써 GZIP 바닥글을 포함한 전체 압축 데이터를 데이터 없이 압축 해제할 수 있음을 보장합니다. 손실.
위 내용은 ## GZIP Writer 폐쇄를 연기하면 Go에서 데이터 손실이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!