为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Docker 的 Go SDK 时输出中的杂散字符

使用 Docker 的 Go SDK 时输出中的杂散字符

Go
GCT1015 2022-09-05 17:32:21
我正在尝试将通过Go运行Docker映像后获得的(接口)转换为进一步使用。io.ReadCloserdocker-sdk[]byte当我从使用到读取时,它可以完美地打印数据。io.ReadCloserstdcopy.StdCopystdout代码打印:stdcopy.StdCopy(os.Stderr, os.Stdout, out)Content-Type: text/html<html><head><title>HTML response</title></head><body><h1>Hello, Goodbye</h1></body></html>由于我需要将此整个内容作为响应发送,因此我需要将内容转换为 或 。但是,一旦我将 转换为或使用任何方法但是,它就会在某些行中添加一个特殊字符。[]bytestringio.ReadCloser[]bytestringstdcopy.StdCopy我用来阅读的片段使用:outbuf*bytes.Buffer.ReadFrom    buf := new(bytes.Buffer)    buf.ReadFrom(out)    fmt.Println(buf.String())指纹:Content-Type: text/html<html>*<head><title>HTML response</title></head>%<body><h1>Hello, Goodbye</h1></body></html>如您所见,额外的字符如和正在添加。我也尝试过功能,没有运气。任何建议将不胜感激。*%ioutil.ReadAll
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

这些是杂散字节,如 、 等,以某些行为前缀。*%


杂散字节似乎是自定义流多路复用协议,允许并沿着同一连接发送。STDOUTSTDERR


使用解释这些自定义标头和那些杂散字符,通过删除每条数据的协议标头来避免。stdcopy.StdCopy()


参考: https://github.com/moby/moby/blob/master/pkg/stdcopy/stdcopy.go#L42


// Write sends the buffer to the underneath writer.

// It inserts the prefix header before the buffer,

// so stdcopy.StdCopy knows where to multiplex the output.

// It makes stdWriter to implement io.Writer.

所以,你的朋友是和使用Docker时的替代品和朋友。stdcopy.StdCopyio.Copy


一个示例,为您提供一个想法:


package main


import (

    "bytes"

    "fmt"

    "io"

    "strings"

)


var resp string = `

Content-Type: text/html

<html>

<head><title>HTML response</title></head>

<body><h1>Hello, Goodbye</h1></body>

</html>`


func main() {

    src := strings.NewReader(resp)

    dst := &bytes.Buffer{}

    _, _ = io.Copy(dst, src)

    fmt.Println(dst.String())

    // Output:

    //

    // Content-Type: text/html

    // <html>

    // <head><title>HTML response</title></head>

    // <body><h1>Hello, Goodbye</h1></body>

    // </html>

}

签名:AS有一个方法,因此它实现了接口并且它工作。func io.Copy(dst io.Writer, src io.Reader)dst(*bytes.Buffer)Writeio.Writer


现在,当使用时使用相同的想法,因为签名是相同的。https://pkg.go.dev/github.com/docker/docker/pkg/stdcopy#StdCopystdcopy.StdCopy()


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信