how to golang check a variable is nil

5

my code is like this, when I use req, _ := http.NewRequest("GET", "http://www.github.com", content), it will emit exception:

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

but when I use req, _ := http.NewRequest("GET", "http://www.github.com", nil), it works, why? how I set the third argument value

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()
}
go
asked on Stack Overflow Oct 30, 2015 by sundq • edited Oct 30, 2015 by Tom Jowitt

3 Answers

5

A go interface consists of a type and a value. An interface is only nil if both the type and the value are nil. You provided a type but no value: Therefore NewRequest tried to call Read on a nil struct (the value of the interface).

answered on Stack Overflow Oct 30, 2015 by 0x434D53 • edited Oct 30, 2015 by 0x434D53
3

content is nil by default, don't need to assign it

also, you are ignoring the error returned from NewRequest, don't do that. It is telling you why it can't generate a request.

Normal error handling would be something like:

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
}

all that said if you really just want to know if req is nil, do:

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

but as mentioned before, it's much better to handle the error. if err not nil, then you basically can't trust req to be anything valid.

answered on Stack Overflow Oct 30, 2015 by David Budworth
0

It is a classic trap of the golang language.

To check if it is a real Nil:

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

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

answered on Stack Overflow Apr 12, 2021 by tangxinfa

User contributions licensed under CC BY-SA 3.0