0

我想知道将键值表单编码映射写入 http.ResponseWriter 的最优雅的方法是什么。

Respond(kv map[string]string) {
  for key, value := range kv {
    fmt.Fprintf(a.w, "%s:%s\n", key, value)
  }  
}

我必须遵循这种键值格式:

键值形式编码

Key-Value 形式的消息是一系列行。每行以一个键开头,后跟一个冒号,以及与该键关联的值。该行由一个换行符终止(UCS 代码点 10,“\n”)。键或值不得包含换行符,键也不得包含冒号。

不得在冒号或换行符之前或之后添加其他字符,包括空格。消息必须以 UTF-8 编码以生成字节字符串。

我考虑过使用编码/csv,但这不是有点矫枉过正吗?

编辑:到目前为止我想出了什么。(感谢所有建议的答案)

http://godoc.org/github.com/kugutsumen/encoding/keyvalue

https://github.com/kugutsumen/encoding/tree/master/keyvalue

4

3 回答 3

3

标准库对此提供了支持:查看http://godoc.org/net/url#Values

您可以执行以下操作:

f := make(url.Values)
for k, v := range myMap {
    f.Set(k, v)
}
myOutput.WriteString(f.Encode())
于 2013-07-16T21:34:55.540 回答
2

例如,

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
于 2013-07-16T09:52:23.880 回答
1

如果你想在不使用包的情况下将字符串写入WriterGo 中的任何(包括http.ResponseWriterfmt,你可以使用bytes包来读取字符串并将它们写入Writer.

下面的代码使用和字符串创建一个Buffer,然后将它们写入使用函数。keyvaluebytes.NewBufferStringhttp.ResponseWriterWriteTo

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

希望这接近你所追求的。

编辑:您还可以使用包中的strings.Reader类型和相应的WriteTo功能strings

于 2013-07-16T01:26:52.583 回答