Playground link for above code: https://play.golang.org/p/rTrkkzEjRl
On Tuesday, 9 August 2016 17:48:22 UTC+1, Sam Salisbury wrote: > > Thanks for the explanation, > > The update I suggest is to add the following sentence to the end of the > reflect.Value.IsNil documentation: > > Likewise, if v was created by calling ValueOf on an initialised >> interface{} value with a nil value pointer j, v.IsNil will return true, >> whereas j == nil will return false. > > > Based on the following observation: > > var m map[string]interface{} > var i interface{} = m > fmt.Printf("reflect.ValueOf(i).IsNil() == %t\n", > reflect.ValueOf(i).IsNil()) > fmt.Printf("i == nil == %t\n", i == nil) > // output: > // reflect.ValueOf(i).IsNil() == true > // i == nil == false > > > > On Tuesday, 9 August 2016 14:43:41 UTC+1, Ian Lance Taylor wrote: >> >> On Tue, Aug 9, 2016 at 6:23 AM, Sam Salisbury <samsal...@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.