On Tue, Aug 9, 2016 at 6:23 AM, Sam Salisbury <samsalisb...@gmail.com> wrote:
>
> All this gets me thinking, is there any use case where this fact is useful?
> (I.e. a nil-valued interface not being equal to nil via the == operator.)

This has been discussed several times on the mailing list.  An
interface value == nil if it is the zero value of the interface type.
It does not == nil if it holds the zero value of some other type, even
if the zero value of that other type is nil.  Many people would be
surprised if
    var v interface{} = 0
    fmt.Printf("%t\n", v == nil)
printed true.  It should be equally surprising if
    var v interface{} = (*byte)(nil)
    fmt.Printf("%t\n", v == nil)
printed true.

The confusion results because Go, perhaps unfortunately, uses the name
nil to designate both the zero value of an interface and the zero
value of a pointer (and a slice or map or channel too, for that
matter).  If the names were different, this would be less confusing.

> Also, should the reflect.Value.IsNil documentation be updated? It doesn't
> mention this case where it differs*, only the one about it panicking on a
> zero reflect.Value.
>
> * IsNil returns true for an interface{} with a nil value pointer, even
> though '== nil' return false.

What update do you suggest?  You say there is a "case where it
differs", but by my reading there is not.  It may help to read
https://blog.golang.org/laws-of-reflection .

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to