gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:10:03 24 4
gpt4 key购买 nike

运行这个程序:

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)) 时,它按预期工作(阅读:[ 97]).

97 是否等于 [57, 55]?

最佳答案

的确,5755 这两个字节与字符串"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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com