2017-12-08 13 views
0

컨텍스트 : 단위 테스트를하고 예상 오류가 있는지 확인하려고했습니다. 내가 오류를 정확한에 비교되는 간단한 무언가를 시도하고 내가 비교가 반환 된 놀람이었다 있도록골란의 오류를 비교하는 방법

나는 예상 된 결과가 없었다 "거짓"

e1 := errors.New("error") 
e2 := errors.New("error") 
fmt.Println(e1 == e2) // false 

실행 예 : https://play.golang.org/p/cvjjiJT_5T

누군가가 나를 설명 할 수있다 이것이 왜 false를 반환하는지과 오류 사이의 동등성을 올바르게 검사하는 방법은 무엇입니까?

+3

errors.New는 값을 가리키는 포인터를 반환합니다. e1/e2는 다른 값에 대한 다른 포인터입니다. 평등성 테스트는 내부 값이 아닌 포인터 주소를 검사하기 때문에 반드시 거짓입니다. % # v 형식의 https://play.golang.org/p/Vu5kaBhh6y를 사용하여이를 볼 수 있습니다. 강력하게 형식화 된 오류를 사용하고 대신 어설 션을 입력하십시오. –

답변

3

동일한 오류 메시지로 두 개의 다른 오류 변수를 생성하고 있습니다. ==과 비교할 때 동일한 변수가 아니기 때문에 false이됩니다.

오류 메시지를 비교하려면 e1.Error() == e2.Error()을 시도하십시오. 그러나 오류 메시지를 비교하는 것은 여전히 ​​좋은 생각이 아닙니다. 몇 가지 오류 상수 (예 : e1 == ErrContentNotFound)를 만들거나 오류에 ID를 추가하고이를 비교할 수 있습니다 (예 : e1.ID == ContentNotFoundID). 자세한 내용은 https://dave.cheney.net/2016/04/07/constant-errors (및 해당 링크의 관련 게시물)을 확인하십시오.