最近、golang でループに陥る何かに出くわしました。
package main
import (
"net/http"
"bytes"
"fmt"
"io/ioutil"
)
func createRequest(method, uri string, data *bytes.Buffer) string {
req, err := http.NewRequest(method, uri, data)
if err != nil {
return ""
}
req.Close = true
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return ""
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return ""
}
return string(respBody)
}
func createRequestNoBody(method, uri string) string {
req, err := http.NewRequest(method, uri, nil)
if err != nil {
return ""
}
req.Close = true
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return ""
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return ""
}
return string(respBody)
}
func main() {
data := createRequestNoBody("GET", "http://google.com")
if len(data) != 0 {
fmt.Println("First Request Ok")
}
data = createRequest("GET", "https://google.com", nil)
if len(data) != 0 {
fmt.Println("Second Request OK")
}
}
このコードは、createRequestNoBody
nil が直接渡された場合に機能しますが、呼び出し元の関数でset を使用して呼び出すとhttp.NewRequest
パニックが発生します。createRequest
*bytes.Buffer
nil
http ライブラリの NewRequest 関数には、次のプロトタイプがあります。
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
インターフェイスはどこio.Reader
にありますか。
nil が変数を介して渡されるとbody
、NewRequest が非 nil になる理由がわかりません。
createRequest
メソッドがパニックになる理由を誰か説明できますか? メソッドdata = createRequest("GET", "https://google.com", nil)
内で非 nil になるときの nil パラメータはどのようになっていますか?NewRequest