On Fri, Sep 16, 2016 at 8:24 AM, Giang Tran <secm...@gmail.com> 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.

Reply via email to