- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
运行这个程序:
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
r, w := io.Pipe()
go func() {
defer w.Close()
in := 'a' // single quote
fmt.Println("writing: ", in)
fmt.Fprint(w, in)
}()
defer r.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(r)
fmt.Print("read: ", buf.Bytes())
}
这个输出:
writing: 97
read: [57 55]
当我执行 in := "a"
或 fmt.Fprint(w, string(r))
时,它按预期工作(阅读:[ 97]
).
97 是否等于 [57, 55]?
最佳答案
的确,57
和55
这两个字节与字符串"97"
中的两个字符相同。如果您将最后一行更改为使用 String()
而不是 Bytes()
,您将获得字符串:
fmt.Print("read: ", buf.String())
当您使用 Bytes()
时,您将获得 "9"
的字节值,即 57
,然后是“7”
,即 55
。
正如 Peter 在评论中指出的那样,您可能不理解 fmt.Fprint
正在做什么——它将 rune 'a'
转换为字符串 "97"
(这与 fmt.Println
为您提供“writing: 97”的方式相同)。如果您不想在写入管道时进行该转换,则不要使用 fmt.Printf
。正如 Peter 所建议的,w.Write
是一个不错的选择。例如,w.Write([]byte{byte(in)})
执行您似乎想要的操作,并允许最后一行按您希望的方式工作而无需更改。另一种选择是 fmt.Fprintf(w, "%c", in)
。
关于go - 从 io.PipeReader 读取与写入 io.PipeWriter 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49475600/
PipeReader.ReadAsync返回 ReadResult对象,它又包含一个 Buffer返回 ReadOnlySequence 的属性对象。 此数据将用于解析来自设备的消息,每条消息都有一个
我想在 io.Pipe 中跟踪进度。我想到了以下结构 ProgressPipeReader,它包装了 io.PipeReader,将进度以字节为单位存储在 ProgressPipeReader.pro
我在一个项目中使用了类似的东西,我有点困惑:为什么什么都没有打印出来? package main import ( "fmt" "encoding/json" "io" ) f
目前,我通过使用 SSL 流实现了一个有效的实现,封装在缓冲流中,并且只使用字节数组在流上调用读/写。 我想让它更快,从一些阅读来看,System.IO.Pipelines 似乎是实现高性能 IO 的
我有一些 ASP.NET Core 中间件(一个 AuthorizationHandler )需要访问请求的主体以执行授权检查。我使用新的 pipelines APIs 访问请求正文。代码如下所示:
运行这个程序: on play.golang.org package main import ( "bytes" "fmt" "io" ) func main() {
我是一名优秀的程序员,十分优秀!