最近,我偶然發現了一些讓我在golang中循環的東西。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")
}
}
此代碼時無直接傳遞到http.NewRequest
但隨着*bytes.Buffer
設置爲nil
調用函數中調用createRequest
時,它會產生一個恐慌工作在createRequestNoBody
功能。
在HTTP庫NewRequest函數的原型如下:
func NewRequest(method, urlStr string, body io.Reader) (*Request, error)
凡io.Reader
是一個接口。
我不確定爲什麼通過變量的nil會導致NewRequest中的body
變爲非零。
任何人都可以解釋爲什麼createRequest
方法導致恐慌?在NewRequest
方法中,data = createRequest("GET", "https://google.com", nil)
的nil參數如何變爲非零?
請參見[常見問題解答:爲什麼我的nil錯誤值不等於零?](https://golang.org/doc/faq#nil_error) – JimB
[隱藏nil值,理解爲什麼golang在這裏失敗] (http://stackoverflow.com/questions/29138591/hiding-nil-values-understanding-why-golang-fails-here) – icza
感謝鏈接@JimB,這的確解釋了它。當它在createRequest函數之間傳遞時,它在接口中獲得一個類型,並通過(* bytes.Buffer,nil)而不是(nil,nil)傳遞給下一個函數。 在調用NewRequest(nil,nil)或(* bytes.Buffer,nil)之前是'data'的值。我不確定它什麼時候變成(* bytes.Buffer,nil)是問題所在。 – soluwalana