簡體   English   中英

Golang意外的EOF

[英]Golang unexpected EOF

這是我的代碼,我是Go的新手。 我曾嘗試使用Google搜索該問題,但我對此完全沒有把握。 我認為這與Read()方法有關。

package main

import (
    ...
)

type compressor struct {
    content []byte
}

func (r *compressor) compress() []byte {
    ...
}

func (r *compressor) decompress() []byte {
    var buffer bytes.Buffer
    dc := flate.NewReader(&buffer)
    _, err := dc.Read(r.content)
    if err != nil {
        if err != io.EOF {
            log.Fatal(err)
        }
    }

    return buffer.Bytes()
}

func main() {
    fileName := os.Args[1]
    fmt.Println(os.Args)
    contents, err := ioutil.ReadFile(fileName)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Print("Uncompressed data: ")
    fmt.Println(len(contents))

    comp := compressor{contents}
    buffer := comp.decompress()
    fmt.Print("Uncompressed data: ")
    fmt.Println(len(comp.decompress()))

    err = ioutil.WriteFile(fileName+".decjc", buffer, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

這是輸出

dylan @ skynet:〜/ Documents / EXP / jc $ ./jc data.txt.jc

[./jc data.txt.jc]

未壓縮數據:2364480

2018/06/29 21:41:35意外的EOF

您進入了,輸出混合了。

flate.NewReader將壓縮后的輸入作為io.Reader並返回io.ReadCloser ,可用於獲取未壓縮的輸出:

func (r *compressor) decompress() []byte {
    dc := flate.NewReader(bytes.NewReader(r.content))
    defer dc.Close()
    rb, err := ioutil.ReadAll(dc)
    if err != nil {
        if err != io.EOF {
            log.Fatalf("Err %v\n read %v", err, rb)
        }
    }
    return rb
}

在對有問題的特定代碼進行跟蹤之后,我得到了以下答案。

/src/bytes/reader.go 70

func (r *Reader) ReadByte() (byte, error) {
    ...

    if r.i >= int64(len(r.s)) {
        return 0, io.EOF
    }

    ....
}

字節/讀取器中有四個函數可以返回io.EOF ,而零個函數可以返回io.ErrUnexpectedEOF 可以返回io.EOF的四個函數是:

Read(b []byte)
ReadAt(b []byte, off int64)
ReadByte()
ReadRune()

/src/compress/flate/inflate.go 698

func (f *decompressor) moreBits() error {
    c, err := f.r.ReadByte()
    if err != nil {
        return noEOF(err)
    }

    ...
}

在可以返回io.EOF的四個函數中,只有io.EOF / inflate.go中的一個函數調用其中任何一個: moreBits()調用ReadByte()

/src/compress/flate/inflate.go 690

func noEOF(e error) error {
    if e == io.EOF {
        return io.ErrUnexpectedEOF
    }

    ...
}

moreBits()收到錯誤時,它將調用noEOF() ,該方法將檢查是否已收到io.EOF 如果是這種情況,則返回io.ErrUnexpectedEOF 一切似乎都按預期進行,似乎需要用戶注意這種特殊情況。 建議對上面的代碼進行編輯,以處理似乎已定義的行為:

func (r *compressor) decompress() []byte {
    dc := flate.NewReader(bytes.NewReader(r.content))
    defer dc.Close()
    rb, err := ioutil.ReadAll(dc)
    if err != nil {
        if err != io.EOF && err != io.ErrUnexpectedEOF {
            log.Fatalf("Err %v\n read %v", err, rb)
        }
    }
    return rb
}

這在go1.12.9下進行了檢查

相當於貓&lt; <eof in golang< div><div id="text_translate"><p> 我正在嘗試執行等效的操作:</p><pre> cat &lt;&lt;EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:${reg_port}" EOF</pre><p> 在戈朗。</p><p> 我目前的嘗試歸結為:</p><pre> func generateConfig(port string) string { return ` apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:" + port` } func main() { exec.Command("kubectl", "apply", "-f", "-", generateConfig(5000)) }</pre><p> 發現它不起作用並出現錯誤,我並不感到特別驚訝:</p><pre> error: Unexpected args: [ apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:5000"]</pre><p> 我認識到我將這些作為 args 傳遞並且 kubectl 需要一個文件,但是我發現自己完全不知道如何繼續。</p><p> 我寧願不制作臨時文件或調用單獨的 bash 腳本,因為這看起來比我希望的必要要復雜。</p></div></eof>

[英]Equivalent to cat <<EOF in golang

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 帶有嵌套模板的 Golang 意外 EOF 在 gzip 中使用 golang bufio 時出現意外的 EOF Golang rpc 調用解決意外的 EOF Golang語法錯誤:寫入文件時出現意外的EOF Golang MySQL 錯誤 - packets.go:33: 意外的 EOF GoLang GraphQL顯示EOF 相當於貓&lt; <eof in golang< div><div id="text_translate"><p> 我正在嘗試執行等效的操作:</p><pre> cat &lt;&lt;EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:${reg_port}" EOF</pre><p> 在戈朗。</p><p> 我目前的嘗試歸結為:</p><pre> func generateConfig(port string) string { return ` apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:" + port` } func main() { exec.Command("kubectl", "apply", "-f", "-", generateConfig(5000)) }</pre><p> 發現它不起作用並出現錯誤,我並不感到特別驚訝:</p><pre> error: Unexpected args: [ apiVersion: v1 kind: ConfigMap metadata: name: testMap namespace: default data: details: host: "localhost:5000"]</pre><p> 我認識到我將這些作為 args 傳遞並且 kubectl 需要一個文件,但是我發現自己完全不知道如何繼續。</p><p> 我寧願不制作臨時文件或調用單獨的 bash 腳本,因為這看起來比我希望的必要要復雜。</p></div></eof> 插入到 PostgreSQL 時出現意外的 EOF golang:ssh:握手失敗:EOF 去1.11.2 xml意外的EOF
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM