最近私はゴランのループのために私を投げつけた何かを見つけました。ゼロがhttp.NewRequest
に直接渡されたときGoLang - インターフェイスを受け入れる関数にnilを渡す
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
に*bytes.Buffer
セットでcreateRequest
を呼び出すときには、パニックを生成します。 io.Reader
インターフェイスをある
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
:
HTTPライブラリでNewRequest機能は、次のプロトタイプを持っています。
なぜ変数にnilが渡されたのかわからないので、NewRequestのbody
はNilになりません。
誰もがcreateRequest
メソッドがパニックに陥る理由を説明できますか? data = createRequest("GET", "https://google.com", nil)
のnilパラメータは、NewRequest
メソッドの中でnil以外の値になりますか?
[FAQ:なぜnilエラー値がnilと等しくないのですか?](https://golang.org/doc/faq#nil_error) – JimB
[nil値を非表示にする理由、ここでゴランが失敗する理由を理解する] (http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here) – icza
リンク@ JimBありがとう、確かにそれを説明します。それがcreateRequest関数の間で渡されると、インタフェースで型を取得し、それは(nil、nil)の代わりに(* bytes.Buffer、nil)として次の関数に渡されます。 NewRequest(nil、nil)または(* bytes.Buffer、nil)を呼び出す前の 'data'の値です。私はそれがいつ(* bytes.Buffer、nil)になるかは分かりません。 – soluwalana