如何优雅或有效地将地图写入http.ResponseWriter

时间:2013-07-16 00:21:34

标签: go

我想知道写一个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但是有点矫枉过正吗?

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

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

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

3 个答案:

答案 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

以下代码使用Bufferkeyvalue字符串创建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