我有一个io.ReadCloser对象(来自一个http.Response对象)。
io.ReadCloser
http.Response
将整个流转换为string对象的最有效方法是什么?
string
编辑:
从 1.10 开始,strings.Builder 就存在了。例子:
buf := new(strings.Builder) n, err := io.Copy(buf, r) // check errors fmt.Println(buf.String())
以下过时信息
简短的回答是它效率不高,因为转换为字符串需要对字节数组进行完整的复制。这是做你想做的正确(非有效)的方法:
buf := new(bytes.Buffer) buf.ReadFrom(yourReader) s := buf.String() // Does a complete copy of the bytes in the buffer.
此副本是作为保护机制完成的。字符串是不可变的。如果可以将 []byte 转换为字符串,则可以更改字符串的内容。但是,go 允许您使用 unsafe 包禁用类型安全机制。使用 unsafe 包的风险由您自己承担。希望这个名字本身就是一个足够好的警告。这是我将如何使用 unsafe 来做到这一点:
buf := new(bytes.Buffer) buf.ReadFrom(yourReader) b := buf.Bytes() s := *(*string)(unsafe.Pointer(&b))
好了,您现在已经有效地将字节数组转换为字符串。实际上,所有这些都是欺骗类型系统将其称为字符串。这种方法有几个注意事项:
我的建议是坚持官方的方法。做一个副本并不那么昂贵,也不值得不安全的罪恶。如果字符串太大而无法复制,则不应将其制作成字符串。