从 io.Reader 到 Go 中的字符串

2024-03-03

我有一个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))

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

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

我的建议是坚持官方方法。复印不是that价格昂贵,而且不值得承受不安全的祸害。如果字符串太大而无法进行复制,则不应将其制作为字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 io.Reader 到 Go 中的字符串 的相关文章

  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • golang:使用 gin 路由器服务 net.Conn

    我有一个处理传入 TCP 连接的函数 func Handle conn net Conn error 另外 我有一个初始化的 gin 路由器 带有已实现的句柄 router gin New router GET router POST Th
  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • exec git 命令拒绝重定向到 Go 中的文件

    我试图从 go 调用 git log 并将输出重定向到给定文件 cmdArgs string log numstat reverse fmt Sprintf s HEAD 89c98f5ec48c8ac383ea9e27d792c3dc77
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹

随机推荐

  • ngrx/data 实体数据服务

    尝试理解ngrx data实体数据服务示例here https ngrx io guide data creating entity data services 其中显示 创建实体数据服务 在展示该服务之后 文档继续展示如何在组件中使用 n
  • C++ 重载虚函数发出 clang 警告?

    clang 在编译以下代码时发出警告 struct Base virtual void get char e virtual void get char e int index struct Derived public Base virt
  • 如果 ID 存在则更新记录,否则插入值

    如果记录存在 我正在尝试更新值 否则将值插入数据库 然而 这是行不通的 我写了下面的代码 String sqlCheck Select from UAP dbo UAP EMPLOYEE where EMP EMPLOYEE ID empI
  • 在 XCode 5 中应用程序窗口预计在应用程序启动结束时有一个根视图控制器

    我使用 Single View 或 Master View 模板在新的 XCode 5 中创建的每个新项目都会给我错误 应用程序窗口预计在应用程序启动结束时有一个根视图控制器 但只有当 UIView 等对象添加到类中时才会出现错误 我一如既
  • 无法在 Visual Studio 2010 中调试 MVC 源代码

    我正在尝试使用 Microsoft 符号服务器在 Visual Studio 2010 中调试 MVC 源代码 我已经配置了调试选项 如下所示 我的项目面向 NET Framework 4 0 如中所述调试 NET Framework 的源
  • 如何在 CMake 中使用 c++20 模块?

    Clang http clang llvm org docs Modules html and MSVC http blogs msdn com b vcblog archive 2015 12 03 c modules in vs 201
  • PHPUnit:模拟除某些方法之外的所有方法

    我正在编写一个 PHPUnit 测试 我需要模拟一些依赖项 但我需要一些方法才能使其仍然像以前一样工作 即 我有 class Dependency some stuff not important for the test public f
  • Rails 中两个表充当一个模型

    Rails 是否可以在依赖于两个表的联接的模型上进行设置 这意味着要找到 更新 销毁模型记录 需要将两个数据库表中的两条记录通过联接链接在一起 该模型只是将两个表的所有列包装在一起 然后可用于表单等 这样 当模型被创建 更新时 它只是一种应
  • 为 Mips 架构编译 C

    我已经看到了几种方法来做到这一点 到目前为止我还没有尝试过几种 但我想为了方便起见隔离这个方法 应该有一种方法可以通过 VIA gcc 来做到这一点 我更喜欢这个 我只是不断碰壁 我正在使用 debian7 并且可以使用其他任何风格 我暂时
  • 有人知道托管 TeamCity 构建提供商吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望建立一个 TeamCity 服务器来持续构建 NET Web 应用程序 我已经有了托管 所以我不想
  • 如何使用 PHP 将 base64 编码的二进制数据保存到 zip

    我从 API 请求响应中获取 Base64 二进制编码数据 我需要将其保存为 zip 文件 我使用如下代码
  • git-svn 可以像本地 subversion 客户端一样处理 CRLF 吗?

    我有一个托管在 Linux 上的 Subversion 存储库 但只能通过 Windows 客户端访问 因为它是大型 Windows 应用程序的源代码 如果我可以使用 git svn 由 msysgit 提供 处理这个存储库 那就太棒了 我
  • 在同一位置绘制顶点

    有没有一种方法可以在同一位置绘制两个图的共享节点 例如 两张图 g1 graph ring 5 V g1 name c node1 node2 node3 node4 node5 g1 g1 V g1 1 g2 graph ring 5 V
  • 更有效地编写 HTTP 脚本

    很多时候我想自动化 http 查询 我目前使用 Java 和 commons http 客户端 但可能更喜欢基于脚本的方法 事情真的又快又简单 我可以在其中设置标头 转到页面 而不必担心设置整个 OO 生命周期 设置每个标头 调用 html
  • GWT 2.4.0 RequestFactory 多态性

    GWT 2 4是否支持这种情况 Entity class MyBase Entity class MyChild1 extends MyBase Entity class MyChild2 extends MyBase ProxyFor M
  • 如何在 Remix.run 开发模式下使用内存缓存?

    我需要从一个非常慢且很少变化的 API 获取数据 所以我想我应该使用内存缓存 我首先尝试了一种非常简单的方法 只需将其保存到路径中加载器函数范围之外的变量中 let cache export const loader async gt if
  • 将两个集合与范围条件组合起来

    我有一个集合 产品 其中包含如下文档 id 142347106 name product 1 id 135377126 name product 2 我还有另一个系列 价格 id ObjectId 59310a6bad6e99863c2a6
  • MySQL 与实体框架 6

    我一直在尝试为我的 MySQL 服务器添加 EF 模型 但没有机会 因为它要么在为我的项目选择实体框架版本之前关闭 要么给出 您的项目引用了最新版本的实体框架 但是 无法为您的数据连接找到与此版本兼容的实体数据库提供程序 错误 并且我无法为
  • 针对 Python Web 开发的 TDD 资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不是一名黑客 也不是一名全职程序员 但我希望开始我自己的完整应用程序开发实验 如果我在这里错过了一些简
  • 从 io.Reader 到 Go 中的字符串

    我有一个io ReadCloser对象 来自http Response目的 将整个流转换为最有效的方法是什么string object EDIT 从 1 10 开始 strings Builder 就存在了 例子 buf new strin