如何解码图像并将原始图像保留在 Go 中?

json.Marshal当无法封送数据中的值时,该函数将失败。导致失败的唯一方法是引入一个用于测试的字段并在测试期间输入一个错误的值:


type DocData struct {

    …

    Test       interface{} `json:"test,omitempty"`

}



var induceFailure interface{}



docData.Test = induceFailure

txBytes, err := json.Marshal(docData)

if err != nil {

    return false, fmt.Errorf("failed docData bytes marshalling: %s", err.Error())

}



func TestMarshlFail(t *testing.T) {

    induceFailure = make(chan struct{})

    defer func() {

       induceFailure= nil

    }()

    …

在该行代码上获得测试覆盖率可能不值得麻烦。


与手头的问题无关,这里有一些对您的代码的改进。


包装错误而不是将错误转换为字符串:


return nil, fmt.Errorf("failed docData unmarshalling: %w", err)

因为docData是指针,解组时不需要取值的地址。


err := json.Unmarshal(txData, docData)


临摹微笑
浏览 80回答 1
1回答

手掌心

问题中的代码不会修改磁盘上的文件。图像解码后的当前位置imageFile在文件开头的某个位置。要再次读取文件,请返回文件的开头: imageFile, err := os.Open("image.png") if err != nil { log.Fatal(err) } decodedImage, _, err := image.Decode(imageFile) if err != nil { log.Fatal(err) }// Rewind back to the start of the file._, err := imageFile.Seek(0, io.SeekStart)if err != nil { log.Fatal(err) }// Do something with imageFile here.将log.Fatal错误处理替换为适合您的应用程序的任何内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go