运行此程序:
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))
时,它会按预期工作(read: [97]
)。
97以某种方式等于[57,55]吗?
答案 0 :(得分:1)
实际上,两个字节57
和55
与字符串"97"
中的两个字符相同。如果您将最后一行更改为使用String()
而不是Bytes()
,则您将获得字符串:
fmt.Print("read: ", buf.String())
当您使用Bytes()
时,您获得的"9"
字节值为57
,后跟"7"
的字节值,即55
1}}。
正如彼得在评论中指出的那样,您可能无法理解fmt.Fprint
正在做什么 - 它将符文'a'
转换为字符串"97"
(这是与fmt.Println
给你的方式相同"写作:97")。如果您在写入管道时不想进行转换,请不要使用fmt.Printf
。正如彼得所说,w.Write
是一个不错的选择。例如,w.Write([]byte{byte(in)})
执行您想要的操作,并允许最后一行以您希望的方式工作。另一种选择是fmt.Fprintf(w, "%c", in)
。