【发布时间】:2021-11-29 09:18:15
【问题描述】:
正在阅读使用 io.Pipe 来减少分配(无需将 cmd.Stdout 分配给 bytes.Buffer)。如果我非常了解如何使用 io.Pipe 从 exec.command 获取输出以发出 http mutliform 发布请求,我无法让以下工作和感激。
func main() {
cmd := exec.Command("convert", "test.png", "-resize" "30x30", "png:-")
bodyReader, bodyWriter := io.Pipe()
cmd.Stdout = bodyWriter
formWriter := multipart.NewWriter(bodyWriter)
go func() {
cmd.Run()
partWriter, err := formWriter.CreateFormFile("file", "file")
if err != nil {
fmt.Println("form writer create error")
return
}
_, err = io.Copy(partWriter, bodyReader)
if err != nil {
fmt.Println("io copy error")
return
}
formWriter.Close()
bodyWriter.Close()
}()
url := "http://example.com/upload"
req, _ := http.NewRequest(http.MethodPost, url, bodyReader)
req.Header.Set("Content-Type", formWriter.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("htttp do error")
return
}
fmt.Println(resp.StatusCode)
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("read error")
return
}
fmt.Println("Result:", string(respBody))
}
使用调试工具,它只是挂在resp, err := http.DefaultClient.Do(req),最终输出如下。
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x1218c3b]
goroutine 1 [running]:
main.main()
【问题讨论】:
-
程序中哪一行代码出现了恐慌?