>백엔드 개발 >Golang >Golang에서 비교하는 중 오류가 발생했습니다.

Golang에서 비교하는 중 오류가 발생했습니다.

王林
王林앞으로
2024-02-12 08:20:071071검색

在 Golang 中比较时出现错误

Golang에서 비교 작업을 수행할 때 가끔 오류가 발생합니다. 이러한 오류로 인해 프로그램이 제대로 작동하지 않거나 예상치 못한 결과가 발생할 수 있습니다. 본 글에서는 PHP 에디터 스트로베리의 도입을 활용하여 Golang에서 비교할 때 발생할 수 있는 오류를 분석하고 그에 따른 해결방안을 제시하겠습니다. 이러한 일반적인 오류를 이해함으로써 Golang의 비교 연산을 더 잘 이해하고 사용할 수 있으며 프로그램의 안정성과 정확성을 향상시킬 수 있습니다. 함께 탐험해 보세요!

질문내용

오늘 커스텀 오류를 구현하려던 중 문제가 발생했습니다. 내 서비스에는 내부 오류에 대한 일반 오류와 사용자 관련 오류를 처리하기 위한 사용자 오류라는 두 가지 유형의 오류가 있습니다. 따라서 오류를 처리하기 위한 일부 메타데이터와 함수가 포함된 사용자 오류에 대한 구조가 있습니다. 이 함수에서는 표준 오류에 대한 래퍼를 사용합니다. 기능으로. 하지만 작동 방식이 이상합니다. 어떤 이유로든 일반적인 오류도 사용자 오류로 처리합니다. 코드 조각은 다음과 같습니다.

으아악

여기에서는 두 가지 오류를 허용하고 이를 비교하는 함수(As 및 AsV2)를 테스트하고 있습니다. 유일한 차이점은 두 번째 함수가 오류 유형 대신 대상 오류의 인터페이스를 승인한다는 것입니다. IsUserError 함수에서 UserError 포인터를 수동으로 생성하고 이를 Errors.As 함수에 제공합니다. 하지만 이 프로그램을 출력하면 다음과 같은 결과가 나옵니다:

으아악

제 질문은 처음 두 경우에 오류가 발생하는 이유입니다. 즉, 같은 종류의 오류인데 세 번째 경우에만 정답을 주는 걸까요? Go에서 인터페이스가 작동하는 방식을 제가 잘못 이해하고 있는 걸까요?

해결책

그렇지 않습니다. 처음 두 경우에는 각각 오류를 Errorinterface{}로 올바르게 보고합니다. 추가한 불필요한 래퍼 함수는 간접 참조를 생성하여 더욱 혼란스럽습니다. 그러나 호출하는 경우:

으아악

예상한 결과를 얻습니다. IsUserError 按预期工作,因为它将正确的类型传递给 errors.Is。我已经清理了您的代码以正常工作(Error 采用非指针接收器,并且不将 emptyError 保留为 nil) 여기에서 실제 동작을 볼 수 있습니다: https://go.dev/play/p/c5EPB5IGeD5

으아악

위 내용은 Golang에서 비교하는 중 오류가 발생했습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제