>백엔드 개발 >Golang >## GZIP Writer 폐쇄를 연기하면 Go에서 데이터 손실이 발생하는 이유는 무엇입니까?

## GZIP Writer 폐쇄를 연기하면 Go에서 데이터 손실이 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 04:53:02527검색

## Why Does Deferring GZIP Writer Closure Lead to Data Loss in Go?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.