- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我见过三种将内容写入 HTTP 响应的方法:
func Handler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "blabla.\n")
}
func Handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("blabla\n"))
}
fmt.Fprintf(w, "blabla")
最佳答案
io.Writer
输出流代表一个目标,您可以向其写入字节序列。在 Go 中,这是由一般 io.Writer
捕获的界面:
type Writer interface {
Write(p []byte) (n int, err error)
}
Write()
方法可以用作输出,例如磁盘上的文件 (
os.File
)、网络连接 (
net.Conn
) 或内存缓冲区 (
bytes.Buffer
)。
http.ResponseWriter
用于配置HTTP响应并将数据发送到客户端的也是这样的
io.Writer
,您要发送的数据(响应正文)是通过调用(不一定只是一次)
ResponseWriter.Write()
来组装的(这是为了实现一般
io.Writer
)。这是您对
http.ResponseWriter
实现的唯一保证。接口(interface)(关于发送正文)。
WriteString()
WriteString()
.通常我们想将文本数据写入
io.Writer
.是的,我们可以简单地通过转换
string
来做到这一点。到
[]byte
,例如
w.Write([]byte("Hello"))
io.StringWriter
捕获了一个“普遍”接受的方法。接口(interface)(自
Go 1.12 起可用,在此之前未导出):
type StringWriter interface {
WriteString(s string) (n int, err error)
}
string
的可能性。值而不是
[]byte
.所以如果某些东西(也实现了
io.Writer
)实现了这个方法,你可以简单地传递
string
没有
[]byte
的值转换。这似乎是代码中的一个小简化,但不仅如此。转换
string
至
[]byte
必须复制
string
内容(因为
string
值在 Go 中是不可变的,请在此处阅读更多相关信息:
golang: []byte(string) vs []byte(*string) ),因此如果
string
有一些开销会变得明显是“更大”和/或您必须多次这样做。
io.Writer
的性质和实现细节,或许可以写出
string
的内容无需将其转换为
[]byte
从而避免上述开销。
io.Writer
是写入内存缓冲区的东西(
bytes.Buffer
就是这样的一个例子),它可以利用内置的
copy()
功能:
The copy built-in function copies elements from a source slice into a destination slice. (As a special case, it also will copy bytes from a string to a slice of bytes.)
copy()
可用于复制
string
的内容(字节)成
[]byte
不转换
string
至
[]byte
,例如:
buf := make([]byte, 100)
copy(buf, "Hello")
io.WriteString()
写一个
string
成
io.Writer
.但是它通过首先检查(的动态类型)是否通过
io.Writer
来做到这一点。有一个
WriteString()
方法,如果是,则将使用该方法(其实现可能更有效)。如果通过
io.Writer
没有这样的方法,那么一般的转换为字节 slice 并写入该方法将用作“后备”。
WriteString()
只会在内存缓冲区的情况下占上风,但事实并非如此。 Web 请求的响应也经常被缓冲(使用内存缓冲区),因此在
http.ResponseWriter
的情况下它可能会提高性能也。如果你看看
http.ResponseWriter
的实现: 这是未导出的类型
http.response
(
server.go
当前第 308 行)确实实现了
WriteString()
(当前第 1212 行)所以它确实意味着改进。
string
值,推荐使用
io.WriteString()
因为它可能更有效(更快)。
fmt.Fprintf()
fmt.Fprintf()
如果你想格式化
string
以简单的方式创建,例如:
name := "Bob"
age := 23
fmt.Fprintf(w, "Hi, my name is %s and I'm %d years old.", name, age)
string
写成:
Hi, my name is Bob and I'm 23 years old.
fmt.Fprintf()
需要一个格式字符串,因此它将被预处理而不是按原样写入输出。举个简单的例子:
fmt.Fprintf(w, "100 %%")
"100 %%"
将被写入输出(有 2 个
%
个字符),但只有一个会被发送,如格式字符串
%
是一个特殊字符和
%%
只会产生一个
%
在输出中。
string
使用
fmt
打包,使用
fmt.Fprint()
不需要格式
string
:
fmt.Fprint(w, "Hello")
fmt
的另一个好处包是你也可以写其他类型的值,而不仅仅是
string
s,例如
fmt.Fprint(w, 23, time.Now())
string
以及最终转换为一系列字节的规则在
fmt
包的文档中有明确定义。)
fmt
包可能没问题。对于复杂的输出文档,请考虑使用
text/template
(用于一般文本)和
html/template
(只要输出是 HTML)。
http.ResponseWriter
http.ResponseWriter
通常更有效。这是一个
io.Writer
如果它支持将结果写入
io.Writer
即时。
json.Marshal()
将对象编码为 JSON。 ,它返回一个字节 slice ,您可以通过调用
ResponseWriter.Write()
简单地发送它。 .
json
更有效率包知道你有一个
io.Writer
,最终你想把结果发送给那个。这样就没有必要首先在缓冲区中生成 JSON 文本,您只需将其写入响应然后丢弃。您可以新建一个
json.Encoder
调用
json.NewEncoder()
您可以通过您的
http.ResponseWriter
作为
io.Writer
,并调用
Encoder.Encode()
之后将直接将 JSON 结果写入您的响应编写器。
关于string - ResponseWriter.Write 和 io.WriteString 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37863374/
我正在执行 UPDATE .WRITE() 语句,并发现它显然只有在您像这样定义它时才有效: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE
我在 Unix 系统上用 C 编程。我知道: write(fd,"ABCD",4); 比这样做更好: write(fd, "A", 1); write(fd, "B", 1); write(fd, "
func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return h.Sum32() } 对于这
在经典的 asp 页面中,有人告诉我您可以使用 vbscript 或 jscript。而 jscript 就是 javascript。 所以我不确定 Response.Write、Response.W
当 openssl 子进程尝试 write() 到本地目录时,我收到此错误。在调用 write() 之前连接已关闭。它没有与 ssl 连接,因为我什至无法从 nodejs 文档启动示例代码。 我错过了
最近我在试验netty。我遇到了以下问题: ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但是 ctx.cha
请解释以下内容: def feed(data): import os print "DATA LEN: %s" % len(data) f = open("copy", "w") f.
有什么区别debug.write 和 Trace.write ?每个应该什么时候使用? 最佳答案 在典型的发布构建配置中,Debug class 被禁用并且什么都不做。 Trace但是,仍然可以在发行
我只是想知道,就性能而言,哪个更好(我在 FileStream 中使用 StreamWriter): 多次调用 Stream.Write(): StreamWriter sw = new Stream
我发现自己写给 stringwriter,然后在函数末尾执行 resp.Write(sw.ToString())。这是不必要的吗?如果我多次使用 HttpResponse.Write,即使我的页面是
我正在尝试通过 JavaScript 文件从 electron 打开一个新窗口,它可以工作,并打开了新窗口,但我无法将 HTML/文本写入新文件。我收到那个错误: Cannot read proper
我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 byt
我知道这听起来像是一个愚蠢的问题: write(*,*) 和 write(6,*) ?我在我研究所的 super 计算机上运行一个复杂的代码,它通过一个不同于 6 的单元号输出一个数据文件,显然编译的
我有一个结构体,它可以通过一系列复杂的方法调用转换为文本,其中包含大量 write!调用。此文本可以写入文件或调试日志。我正在决定是否使用 fmt::Write 或 io::Write .我不能真正使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
In the C standard library, an output can't be followed by an input and vice versa. 对于Linux API,可以在re
我希望能够为一件事做 document.write。然后延迟半秒,然后再记录。写一些。你知道这是否可能吗?而且,如果是这样,怎么办?到目前为止,我已经尝试过了,但没有奏效: document.writ
为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗? Write Function Alternat
我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str) 计算字
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!