如何golang检查变量是零

时间:2015-10-30 00:23:21

标签: go

我的代码是这样的,当我使用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 个答案:

答案 0 :(得分:5)

go界面由一个类型和一个值组成。如果类型和值都是nil,则接口仅为nil。您提供了一个类型但没有值:因此NewRequest尝试在nil结构上调用Read(接口的值)。

答案 1 :(得分:2)

默认情况下,内容为零,不需要分配

另外,你忽略了从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是否为零,那就说:

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

但如前所述,处理错误要好得多。如果错误不是零,那么你基本上不能相信req是有效的。

答案 2 :(得分:0)

是golang语言的经典陷阱。

要检查它是否是真正的 Nil:

p == nil || reflect.ValueOf(p).IsNil()

参考: https://www.mangatmodi.com/posts/go-check-nil-interface-the-right-way/