我有一个io.ReadCloser
对象(来自http.Response
目的)。
将整个流转换为最有效的方法是什么string
object?
EDIT:
从 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 的方法:
buf := new(bytes.Buffer)
buf.ReadFrom(yourReader)
b := buf.Bytes()
s := *(*string)(unsafe.Pointer(&b))
现在,您已经将字节数组有效地转换为字符串了。实际上,这一切所做的只是欺骗类型系统将其称为字符串。此方法有几个注意事项:
- 不能保证这在所有 go 编译器中都有效。虽然这适用于 plan-9 gc 编译器,但它依赖于官方规范中未提及的“实现细节”。您甚至不能保证这适用于所有体系结构或不会在 gc 中更改。换句话说,这是一个坏主意。
- 该字符串是可变的!如果您对该缓冲区进行任何调用will更改字符串。要特别小心。
我的建议是坚持官方方法。复印不是that价格昂贵,而且不值得承受不安全的祸害。如果字符串太大而无法进行复制,则不应将其制作为字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)