doujiaoben28596 2018-03-25 12:02
浏览 110
已采纳

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

Running this program:

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())

}

This outputs:

writing:  97
read: [57 55]

When I do in := "a" or fmt.Fprint(w, string(r)), it works as expected (read: [97]).

Is 97 equal to [57, 55] somehow?

  • 写回答

1条回答 默认 最新

  • doulangtiao4508 2018-03-25 12:15
    关注

    Indeed, the two bytes 57 and 55 are the same as the two characters in the string "97". If you change your last line to use String() rather than Bytes(), you'll get the string:

    fmt.Print("read: ", buf.String())
    

    When you use Bytes(), you're getting the byte value of "9", which is 57, followed by that of "7", which is 55.

    As pointed out by Peter in the comments, you might not be understanding what fmt.Fprint is doing—it's converting the rune 'a' to the string "97" (this is the same as how fmt.Println is giving you "writing: 97"). If you don't want to do that conversion when you write to the pipe, then don't use fmt.Printf. As Peter suggests, w.Write is a good option. For example, w.Write([]byte{byte(in)}) does what you seem to want, and allows the final line to work the way you want unchanged. Another option would be fmt.Fprintf(w, "%c", in).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    悬赏问题

    • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信
    • ¥15 关于PROCEDURE和FUNCTION的问题
    • ¥100 webapi的部署(标签-服务器)
    • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)
    • ¥15 C语言除0问题的检测方法
    • ¥15 为什么四分管的内径有的是16mm有的15mm,四分不应该是12.7mm吗
    • ¥15 macos13下 ios交叉编译的问题
    • ¥15 bgz压缩文件怎么打开
    • ¥15 封装dll(引入了pcl的点云设计库)
    • ¥30 关于#开发语言#的问题:我需要在抄板的基础上再抄板抄程序,根据RDA8851CM基础上开发