栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从 io.Reader 到 Go 中的字符串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从 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 包禁用类型安全机制。使用 unsafe 包的风险由您自己承担。希望这个名字本身就是一个足够好的警告。这是我将如何使用 unsafe 来做到这一点:

buf := new(bytes.Buffer)buf.ReadFrom(yourReader)b := buf.Bytes()s := *(*string)(unsafe.Pointer(&b))

好了,您现在已经有效地将字节数组转换为字符串。实际上,所有这些都是欺骗类型系统将其称为字符串。这种方法有几个注意事项:

  1. 不能保证这将适用于所有 go 编译器。虽然这适用于 plan-9 gc 编译器,但它依赖于官方规范中未提及的“实现细节”。您甚至不能保证这将适用于所有架构或不会在 gc 中更改。换句话说,这是一个坏主意。
  2. 该字符串是可变的!如果您对该缓冲区进行任何调用,它将更改字符串。要非常小心。

我的建议是坚持官方的方法。做一个副本并不那么昂贵,也不值得不安全的罪恶。如果字符串太大而无法复制,则不应将其制作成字符串。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号