GO言語でhttpリクエストを送るときのbodyにstring以外を加えたい。

http request を行う方法はいくつかあるけれども例えば

json_payload, _ := json.Marshal(payload)  
req, _ := http.NewRequest("POST", endpoint, strings.NewReader(string(json_payload)))  

とかやるとすべての value が string になってしまう。
url value を使っても同じ。

values := url.Values{}  
values.Add("key", "value")  
values.Add("int", 3)   // ここでエラー  

こんな時は buffer を利用するといいことが判明したので、以下の様に実装するとうまくいく。

buf := new(bytes.Buffer)  
_ := json.NewEncoder(buf).Encode(opt)  
req, _ := http.NewRequest("POST", endpoint, buf)