got it, thank you. On Saturday, September 17, 2016 at 12:14:34 AM UTC+7, Ian Lance Taylor wrote: > > On Fri, Sep 16, 2016 at 8:24 AM, Giang Tran <sec...@gmail.com > <javascript:>> wrote: > > > > I have a small test like this > > > > package main > > > > type MError struct { > > > > } > > > > func (m *MError) Error() string { > > return "MError" > > } > > > > func NewMError() *MError { > > return nil > > } > > > > func main() { > > var e error > > e = NewMError() > > println(e.Error()) > > } > > > > > > > > I know that interface actually combine like (Type, value), if I change > > > > > > func (m *MError) Error() string { > > > > > > to > > > > > > func (m MError) Error() string { > > > > > > would lead to "panic: value method main.MError.Error called using nil > > *MError pointer", > > > > why we have this different behave? > > When you have a pointer, and call a value method, what that means is > that the value is copied out of the pointer and then the method is > invoked. That is, when you write e.Error(), where e is type *MError > and Error is a value method, the actual code is something like > tmp := *e > tmp.Error() > But in this case e is nil, so copying out the value fails, and you get a > panic. > > 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.