我有一个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软件包禁用类型安全机制。使用不安全的包装,后果自负。希望仅此名称就足够了。这是我使用不安全方法的方法:
buf := new(bytes.Buffer) buf.ReadFrom(yourReader) b := buf.Bytes() s := *(*string)(unsafe.Pointer(&b))
到此为止,您现在已将字节数组有效地转换为字符串。确实,所有这些都是在欺骗类型系统将其称为字符串。此方法有两个警告:
我的建议是坚持官方方法。进行复制并没有 那么 昂贵,也不值得进行不安全的弊端。如果字符串太大而无法进行复制,则不应将其制成字符串。