- 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/
我正在使用 logrus用于记录并有一些自定义格式记录器。每个都被初始化为写入不同的文件,例如: fp, _ := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|
我创建了一堆 *io.PipeWriter 并希望基于一个函数中的所有这些管道编写器创建一个多编写器。所以我调用一个类似的函数 func copyToWriters(reader *bufio.Rea
运行这个程序: on play.golang.org package main import ( "bytes" "fmt" "io" ) func main() {
我是一名优秀的程序员,十分优秀!