文字列から io.Reader/io.Writer を作る方法

isucon3 とかでも使ったけど string から io.Reader および io.Writer を生成する方法に毎回ハマる気がしたのでメモ.

たとえば s という文字列を io.Reaer にして buf という io.Writer に書き込む場合

https://github.com/nise-nabe/isucon2013-go/blob/master/app.go#L97

var buf bytes.Buffer
p := markdown.NewParser(nil)
p.Markdown(bytes.NewBufferString(s), markdown.ToHTML(&buf))

return template.HTML(buf.String())

例えば git コマンドで HEAD のリビジョンを取得する場合に io.Writer に 外部コマンドの出力結果を書き込む場合

cmd := exec.Command("git", "rev-parse", "HEAD")
cmd.Dir = build.Default.GOPATH + "/src/github.com/nise-nabe/isucon2013-go"
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
  log.Fatal(err)
}

return out.String()