2016-10-19 3 views
-1

누군가이 코드를 설명해 주시겠습니까?
이 메서드를 호출하면 err != nil이 true를 반환하므로 포인터 참조가 nil이됩니다. 나는 이것이 내가 인터페이스에 캐스트 nil의-구조체 포인터를 처리하고 있다는 사실과 함께 할 수있는 뭔가가 있음을 이해인터페이스에서 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

...

그러나 나는 혼란 스러워요 이 인터페이스를 디자인하는 방법 , "스마트"오류 객체를 반환하려는 경우 일반 error이 아닌.

답변

0

올바른 길을 가고있었습니다. 문제는 포인터를 구조체에 반환하고 비 포인터 호출자로 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

"오류가 발생했습니다"- 전달 된 오류 값이 실제로 전무하더라도 :

작업을해야 다음 (나는 단지 Error 방법의 수신기 *을 추가? – cfstras

관련 문제