닫기를 연기하면 gzip Writer에서 데이터 손실이 발생함
Go에서 gzip.NewWriter를 활용하여 바이트 슬라이스를 압축할 때 일반적으로 다음과 같은 현상이 관찰됩니다. 기록기 종료를 연기하면 데이터가 손실됩니다. 이 현상은 압축된 데이터를 읽을 때 예상치 못한 EOF(파일 끝) 오류로 인해 조기에 종료되므로 더욱 분명해집니다.
이를 이해하기 위해 제공된 코드 조각을 살펴보겠습니다.
<code class="go">func zipData(originData []byte) ([]byte, error) { // Create a buffer to store the compressed data var bf bytes.Buffer // Initialize the gzip writer with the buffer gw := gzip.NewWriter(&bf) // Defer closure of the writer defer gw.Close() // Write the original data to the writer _, err := gw.Write(originData) if err != nil { return nil, err } // Flush the writer to write any buffered data if err = gw.Flush(); err != nil { return nil, err } // Return the compressed data return bf.Bytes(), nil }</code>
이 문제는 defer를 사용하여 gzip 작성기(gw)를 닫는 데서 발생합니다. Close()에 대한 문서에 따르면:
"Close는 기록되지 않은 데이터를 기본 io.Writer에 플러시하고 GZIP 바닥글을 작성하여 Writer를 닫습니다."
이 경우 지연된 클로저는 함수가 버퍼(bf)에 저장된 압축된 데이터를 반환한 후에 실행됩니다. 그러나 Close() 메서드가 호출될 때까지 바닥글은 작성되지 않으므로 압축된 데이터가 반환될 때 불완전한 상태로 남습니다.
이 문제는 압축된 데이터를 반환하기 전에 작성기를 수동으로 닫으면 해결될 수 있습니다.
<code class="go">func zipData(originData []byte) ([]byte, error) { // ... (same code as before) ... // Close the writer to write the footer if err := gw.Close(); err != nil { return nil, err } // Return the compressed data return bf.Bytes(), nil }</code>
반환하기 전에 작성기를 닫으면 GZIP 바닥글이 성공적으로 작성되고 EOF 오류 없이 압축된 데이터를 읽을 수 있습니다.
위 내용은 gzip.NewWriter 폐쇄를 연기하면 Go에서 데이터 손실이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!