如何在Golang中检查变量是否为nil

5

我的代码是这样的,当我使用req, _ := http.NewRequest("GET", "http://www.github.com", content)时,会产生异常:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0xffffffff addr=0x0 pc=0xaab78]

goroutine 1 [running]:
net/http.NewRequest(0x34f3b8, 0x3, 0x378020, 0x15, 0xfeec4350, 0x0, 0x10738801, 0x0, 0x0, 0x107000e0)
    /usr/local/go/src/net/http/request.go:570 +0x498
main.main()
    /tmp/sandbox056954284/main.go:17 +0xe0

但是当我使用 req, _ := http.NewRequest("GET", "http://www.github.com", nil)时,它可以正常工作,为什么呢?我该如何设置第三个参数的值?
package main

import (
    "bytes"
    "net/http"
)


func main() {
    client := &http.Client{}
    var content *bytes.Reader
    content = nil
    req, _ := http.NewRequest("GET", "http://www.github.com", content)
    resp, _ := client.Do(req)
    defer resp.Body.Close()
}
3个回答

6
一个 Go 语言接口由类型和值组成。只有当类型和值都为 nil 时,接口才为 nil。你提供了一个类型但没有值:因此 NewRequest 尝试在 nil 结构体上调用 Read 方法(即接口的值)。

但是为什么 content == nil 返回 true 呢? - sundq
因为 bytes.Reader 是一个结构体,而不是接口。但是 http.NewRequest 接受的是 io.Reader,这是一个接口。你将其传递给了一个类型,但没有值 -> 接口不是 nil。 - 0x434D53

3

默认情况下内容为空,不需要进行赋值。

另外,你正在忽略从NewRequest返回的错误,请不要这样做。它会告诉你为什么无法生成请求。

正常的错误处理应该是这样的:

req, err := http.NewRequest("GET", "http://www.github.com", content)
if err != nil {
  // log or complain... req is nil here
} else {
  // do something with req
}

如果你只想知道req是否为nil,可以这样做:

if req == nil { 
 // handle nil req
} else {
 // use req
}

但是如之前所述,更好的做法是处理错误。如果 err 不是 nil,则基本上不能信任 req 是有效的。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接