Hi Ian, thanks for your reply.
After reading and experimenting a lot I think I understand the slight differences between nil and interface{} with nil value. The only thing I find confusing is that interface{}(nil) == nil returns true. (The reason why I use reflect on interface is that I want to operate slice with different element types, like []interface{}, []int and so on.) Best regards, Xinhu Am Fr., 11. Jan. 2019 um 01:39 Uhr schrieb Ian Lance Taylor <i...@golang.org >: > On Thu, Jan 10, 2019 at 3:40 PM <xinhu.li...@gmail.com> wrote: > > > > I want to append a nil value using reflect.Append(), but I got a panic: > reflect: call of reflect.Value.Set on zero Value. > > > > This is my code. > > > > s := make([]interface{}, 10) > > v := reflect.ValueOf(nil) > > reflect.Append(reflect.ValueOf(s), v) > > > > So is there a way i can append nil? Currently I do this as workaround: > > > > s := make([]interface{}, 10) > > s0 := make([]interface{}, 1) > > r := reflect.AppendSlice(reflect.ValueOf(s), reflect.ValueOf(s0)) > > > > It works but I think there must be a better way. > > First you have to clearly distinguish between nil, an uninitialized > value with no type, and the value interface{}(nil), which is an > uninitialized value of type interface{}. You want the latter. Then, > it's always a bit awkward to work with interface types with the > reflect package, because the reflect package naturally tries to look > for the value stored in the interface type, whereas you actually want > the interface type. > > Here is one way to do it: > > https://play.golang.org/p/Qt5-AmYa9Mk > > 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.