- 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/
在我的项目中,我获取用户输入的数据并将其输出到 txt 文件。我已经完成了该项目,除了我需要用户在对话框中输入的员工姓名在输出到对话框时用引号引起来。有人可以指导我如何做到这一点吗? 这是我的代码:
我刚遇到以下行为:当使用 CStdioFile::WriteString 时,它会将 \n 转换为 \r\n。我在我的代码的早期版本中没有注意到这种行为,只是在我将我的项目转换为 Unicode 之后
下面的代码片段会导致错误的结果: void CTesterDlg::OnClickedButtonTest() { CStdioFile myfile; CString strLine1;
我想获取文件的increment id,代码如下: // get increment id func GetID() uint64 { appIdLock.Lock() defer a
以下程序的要点是用每种背景色和前景色的组合打印出字母“c”。 在我使用的库中,颜色定义为 0-15 并使用以下代码: mov eax,FOREGROUND + (BACKGROUND * 16) ca
我正在尝试将西里尔字符写入在 OSX 应用程序中生成的电子表格中: sheet = xlBookAddSheet(book, "Output", 0); detailFormat = xlBookAd
所以我正在尝试向接受最大 482 字符串的队列发送消息。我发送的字符串长度为 452。这是访问请求队列的代码块: var openOptions = MQC.MQOO_OUTP
本文整理了Java中net.sf.okapi.common.XMLWriter.writeString()方法的一些代码示例,展示了XMLWriter.writeString()的具体用法。这些代码示
我见过三种将内容写入 HTTP 响应的方法: func Handler(w http.ResponseWriter, req *http.Request) { io.WriteString(w
如果不使用 zip64 扩展,Zip 文件的大小不能超过 2GB,因此尝试写入超过该限制的文件将无法正常工作。我预计当尝试这样的写作时,它会引发异常,但我无法引发异常。 (文档没有提及此事。)如果在这
本文整理了Java中com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeString()方法的一些代码示例,展示了WriterB
本文整理了Java中com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.writeString()方法的一些代码示例,展示了YAMLGenerato
我目前运行的是 Windows 8 64 位系统,我正在尝试创建一个用于 Web 服务器的日志记录文件。有问题的代码是: func LogWebPath(requestedURL string, ac
我正在使用 PdfBox 的 .net 进行解析,从 pdf 中提取文本以及文本位置。为此,在搜索时我发现了以下 java 代码: PDFTextStripper stripper = new PDF
如何将数据转换为 string 类型?我需要将我需要的数据写到不是变量的文件中,我该怎么做? 代码: package main import "os" import "os/user" import
我是一名优秀的程序员,十分优秀!