2016-10-19 3 views
-1

Может кто-нибудь объяснить этот код для меня?
Когда это вызывается, err != nil возвращает true, что приводит к ссылке на указатель нулевого значения.nil тест на интерфейсе не работает

type E struct{} 

func (e E) Error() string { 
    return "" 
} 

func DoStuff() *E { 
    return nil 
} 

func main() { 
    var err *E 
    err = DoStuff() 
    log.Println(err) // nil 
    testErr(err) 
} 

func testErr(err error) { 
    if err != nil { 
     log.Println("got error", err.Error()) 
    } 
} 

https://play.golang.org/p/iys7U_UMhG

я понял, что это что-то делать с тем, что я имею дело с нильпотоком STRUCT-указателем литого к интерфейсу ...

Однако я запутался как создать этот интерфейс DoStuff, если кто-то хочет вернуть «умный» объект ошибки, а не просто error.

ответ

0

Вы были на правильном пути. Дело в том, что вы возвращаете указатель на struct, а ваш метод Error реализован с помощью не указателя.

должно работать (я только добавил * для приемника Error метода:

package main 

import "log" 

type E struct{} 

func (e *E) Error() string { 
    return "" 
} 

func DoStuff() *E { 
    return nil 
} 

func main() { 
    var err *E 
    err = DoStuff() 
    log.Println(err) // nil 
    testErr(err) 
} 

func testErr(err error) { 
    if err != nil { 
     log.Println("got error", err.Error()) 
    } 
} 
+0

Хотя это не катастрофа, это все еще эхо «получил ошибку» - даже если значение ошибки прошло фактически ноль? – cfstras

Смежные вопросы