0

キー値フォームでエンコードされたマップを http.ResponseWriter に書き込む最もエレガントな方法は何だろうと思っていました。

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

この Key-Value 形式に従う必要があります。

Key-Value フォーム エンコーディング

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

4

3 に答える 3

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

Writerパッケージを使用せずに Go の任意の文字列 ( を含むhttp.ResponseWriter)に文字列を書き込みたい場合はfmt、パッケージを使用しbytesて文字列を読み取り、Writer.

以下のコードはBufferkeyvalue文字列を使用して を作成し、関数を使用してbytes.NewBufferStringに書き込みます。http.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.ReaderType と対応するWriteTo関数を使用することもできます。strings

于 2013-07-16T01:26:52.583 に答える