从io.Reader到Go中的字符串

从io.Reader到Go中的字符串,第1张

从io.Reader到Go中的字符串

编辑:

从1.10开始,strings.Builder存在。例:

buf := new(strings.Builder)n, err := io.Copy(buf, r)// check errorsfmt.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))

到此为止,您现在已将字节数组有效地转换为字符串。确实,所有这些都是在欺骗类型系统将其称为字符串。此方法有两个警告:

  1. 不能保证这将在所有go编译器中都有效。尽管这可以与plan-9 gc编译器一起使用,但它依赖于官方规范中未提及的“实现细节”。您甚至不能保证这将在所有体系结构上都有效或在gc中不会更改。换句话说,这是一个坏主意。
  2. 那串是可变的!如果您对该缓冲区进行任何调用, 它将 更改字符串。要特别小心。

我的建议是坚持官方方法。进行复制并没有 那么 昂贵,也不值得进行不安全的弊端。如果字符串太大而无法进行复制,则不应将其制成字符串。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5125495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存