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

时间:2018-03-25 12:02:15

标签: go

运行此程序:

on play.golang.org

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]吗?

1 个答案:

答案 0 :(得分:1)

实际上,两个字节5755与字符串"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)