英文:
Does Go have a format specifier for io.Readers?
问题
我想要的是这样的东西:
r := strings.NewReader("fee fi fo fum")
fmt.Printf("%r\n", r)
其中 %r
是一个格式说明符,用于从 io.Reader
中读取。我在 fmt 的文档 https://pkg.go.dev/fmt 中没有看到类似的内容,但有可能我错过了。
英文:
What I want is something like this:
r := strings.NewReader("fee fi fo fum")
fmt.Printf("%r\n", r)
where the %r
would be a format specifier that reads from an io.Reader
. I didn't see anything like that in the fmt documentation https://pkg.go.dev/fmt, but it's possible I missed it.
答案1
得分: 2
io.Reader可以是一个永远不会结束的流,因此fmt.Printf
的渲染可能永远不会完成。
如果你知道会有一个离散的有效负载,并且它不是过大的话,你可以将内容加载到内存中:
r := strings.NewReader("fee fi fo fum")
b, _ := io.ReadAll(r)
fmt.Printf("%q\n", b)
这将把读取器的当前位置移动到末尾,因此如果你需要在将来的调用中“重放”读取器,你需要使用另一个io.Reader(例如bytes.Buffer
)来保存原始内容:
r := strings.NewReader("fee fi fo fum")
if debug {
var b bytes.Buffer
_, err = io.Copy(&b, r) // 处理错误
log.Printf("io.Reader内容:%q\n", b.String())
r = &b // 重放
}
// 保留r io.Reader的内容和位置
链接:https://go.dev/play/p/JRS34uX1R1G
英文:
An io.Reader may be a stream which never ends, as such a fmt.Printf
rendering may never complete.
If you know there will be a discrete payload and it's not excessively large, you can load the contents to memory:
r := strings.NewReader("fee fi fo fum")
b, _ := io.ReadAll(r)
fmt.Printf("%q\n", b)
https://go.dev/play/p/DZybA_f6Ole
This will however move the reader current position to the end, so if you need to "replay" the reader in future calls, you need to use another io.Reader (e.g. bytes.Buffer
) to hold the original content:
r := strings.NewReader("fee fi fo fum")
if debug {
var b bytes.Buffer
_, err = io.Copy(&b, r) // handle err
log.Printf("io.Reader content: %q\n", b.String())
r = &b // replay
}
// r io.Reader content and position preserved
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论