Go 读取io.PipeReader与写入io.PipeWriter不匹配

Go 读取io.PipeReader与写入io.PipeWriter不匹配,go,Go,运行此程序: 这将产生: writing: 97 read: [57 55] 当我在:=“a”或fmt.Fprint(w,string(r))中执行时,它会按预期工作(读取:[97]) 97在某种程度上等于[57,55]吗?事实上,两个字节57和55与字符串“97”中的两个字符相同。如果将最后一行更改为使用String()而不是Bytes(),则将得到以下字符串: fmt.Print("read: ", buf.String()) 当您使用Bytes()时,您将得到“9”的字节值,即57

运行此程序:

这将产生:

writing:  97
read: [57 55]
当我在:=“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
在做什么,因为它将符文
'a'
转换为字符串
“97”
(这与
fmt.Println
给您“编写:97”的方式相同)。如果不想在写入管道时进行转换,则不要使用
fmt.Printf
。正如彼得所建议的那样,
w.Write
是一个不错的选择。例如,
w.Write([]字节{byte(in)})
执行您想要的操作,并允许最后一行以您想要的方式工作。另一个选项是
fmt.Fprintf(w,“%c”,in)

[57,55]
等于
“97”
@tkausl那么,如何?我只是不明白,谢谢你的帮助!57位小数='9',55位小数='7'。如果要写入字节“a”,请不要将其转换为带有fmt.Fprint的字符串。例如,直接调用w.Write。@Peter哦,它是“9”+“7”,fmt.Fprint进行了转换。谢谢,太清楚了!
fmt.Print("read: ", buf.String())