我想知道写一个Key Value Form最优雅的方式是什么 编码映射到http.ResponseWriter。
Respond(kv map[string]string) {
for key, value := range kv {
fmt.Fprintf(a.w, "%s:%s\n", key, value)
}
}
我必须遵循以下键值格式:
键值表格编码
键值表单中的消息是一系列行。每一行都开始了 用一个键,后面跟一个冒号,以及与之相关的值 键。该行由一个换行符终止(UCS代码点10, “\ n”)。键或值不得包含换行符和键也必须 不含结肠。
之前不得添加其他字符,包括空格 或冒号或换行后。消息必须以UTF-8编码 产生一个字节串。
我考虑过使用encoding / csv但是有点矫枉过正吗?
编辑:到目前为止我想出了什么。 (感谢所有建议的答案)
答案 0 :(得分:3)
标准库为此提供支持:查看http://godoc.org/net/url#Values。
您可以执行以下操作:
f := make(url.Values)
for k, v := range myMap {
f.Set(k, v)
}
myOutput.WriteString(f.Encode())
答案 1 :(得分:1)
如果您想在不使用Writer
包的情况下向Go中的任何http.ResponseWriter
写入字符串(包括fmt
),您可以使用bytes
包来阅读字符串并将其写入Writer
。
以下代码使用Buffer
从key
和value
字符串创建bytes.NewBufferString
,然后使用{{3}将其写入http.ResponseWriter
功能。
package main
import (
"bytes"
"log"
"net/http"
)
func main() {
kv := map[string]string{"key1": "val1", "key2": "val2", "key3": "val3", "key4": "val4", "key5": "val5"}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
for key, value := range kv {
kvw := bytes.NewBufferString(key + ":" + value + "\n")
if _, err := kvw.WriteTo(w); err != nil {
log.Fatal("Error: ", err)
}
}
})
if err := http.ListenAndServe("localhost:8080", nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
将输出:
KEY1:VAL1
KEY2:VAL2
KEY3:VAL3
KEY4:VAL4
key5:val5
希望这接近你所追求的目标。
编辑:您还可以使用WriteTo
类型以及strings.Reader
包中相应的WriteTo
功能。
答案 2 :(得分:1)
例如,
package main
import (
"bufio"
"bytes"
"fmt"
"io"
)
func WriteRespond(w io.Writer, kv map[string]string) error {
var buf bytes.Buffer
for k, v := range kv {
buf.WriteString(k)
buf.WriteByte(':')
buf.WriteString(v)
buf.WriteByte('\n')
_, err := buf.WriteTo(w)
if err != nil {
return err
}
}
return nil
}
func main() {
kv := map[string]string{
"k1": "v1",
"k2": "v2",
}
var buf = new(bytes.Buffer)
w := bufio.NewWriter(buf)
err := WriteRespond(w, kv)
if err != nil {
fmt.Println(err)
return
}
err = w.Flush()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(buf.Bytes())
fmt.Println(buf.String())
}
输出:
[107 49 58 118 49 10 107 50 58 118 50 10]
k1:v1
k2:v2