我正在研究http 的源代碼Golang,我發現了這個
func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) {
...
rc, ok := body.(io.ReadCloser)
...
}
但這body是nil,它是通過以下方式傳遞的
func NewRequest(method, url string, body io.Reader) (*Request, error) {
return NewRequestWithContext(context.Background(), method, url, body)
}
func (c *Client) Get(url string) (resp *Response, err error) {
req, err := NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
return c.Do(req)
}
函式Get傳遞nil給函式NewRequest,
函式NewRequest將 this 傳遞nil給函式NewRequestWithContext,
那么函式 NewRequestWithContext用來nil呼叫nil.(io.ReadCloser),為什么不引起panic呢?
uj5u.com熱心網友回復:
該宣告
rc, ok := body.(io.ReadCloser)
測驗是否body為 ReadCloser. 如果不是,rc則將設定為nil,并將ok設定為false。
如果代碼是:
rc:=body.(io.ReadCloser)
然后用一個零的身體,它會驚慌失措。
uj5u.com熱心網友回復:
該陳述句rc, ok := body.(io.ReadCloser)是在賦值特殊形式中使用的型別斷言。當body為 nil 時,rc設定為 nil 并ok設定為 false。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414542.html
標籤:
