>  기사  >  백엔드 개발  >  Go가 오류 래퍼에 대한 포인터를 반환하지만 "*error" 대신 "error"로 선언하는 이유는 무엇입니까?

Go가 오류 래퍼에 대한 포인터를 반환하지만 "*error" 대신 "error"로 선언하는 이유는 무엇입니까?

WBOY
WBOY앞으로
2024-02-09 22:40:10549검색

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

Go가 오류 래퍼에 대한 포인터를 반환하지만 "error" 대신 "error"로 선언하는 이유는 무엇입니까? 이는 많은 Go 언어 개발자가 직면하는 일반적인 문제입니다. 간단히 말해서 Go가 오류를 반환하는 방식은 오류를 더 쉽게 사용하고 처리할 수 있도록 하기 위한 것입니다. Go에서 오류는 오류 메시지를 반환하는 Error() 메서드가 있는 인터페이스 유형입니다. 따라서 함수가 오류를 반환하면 실제로는 Error() 메서드를 구현하는 구조에 대한 포인터를 반환합니다. 이 설계를 통해 오류 처리가 더욱 간결하고 유연해지며 코드 중복성과 복잡성이 줄어듭니다. 따라서 포인터를 반환하는 것이 이상해 보일 수도 있지만 실제로는 더 나은 오류 처리를 제공하기 위한 것입니다.

질문 내용

저는 Java 배경에서 Go 언어를 배우고 있습니다.

으아악

위 코드에서 myFunction의 오류 유형이 "*error"가 아닌 "error"인 이유를 이해할 수 없나요? 아래 줄에서는 MyError 구조에 대한 포인터를 명확하게 반환하고 있습니다.

주 함수의 오류를 포인터로 다시 주장할 수 있는 이유도 이해합니다.

해결 방법

Go의 기존 오류 처리를 이해하려면 먼저 언어의 인터페이스 작동 방식을 이해해야 합니다. Go 인터페이스에 대해 이야기할 때 기억해야 할 두 가지 사항이 있습니다:

  1. Go의 인터페이스는 메소드 세트를 정의합니다(Go1.18로 시작하는 것도 유형 세트입니다). 그 이면에는 Go 인터페이스에는 인터페이스 자체가 아닌 유형 T 和值 VV 始终是具体类型,例如 intstruct 또는 포인터라는 두 가지 요소가 포함되어 있습니다.

  2. Go에는 implements 키워드가 없습니다. Go 유형은 메소드를 구현하여 이 인터페이스를 충족합니다. 이것을 암시적구현이라고 합니다.

오류 처리

Go는 단지 인터페이스인 내장 error 유형을 정의합니다.

으아악

사실 전역 미리 선언된 유형이라는 점만 빼면 특별한 점은 없습니다. 이 유형은 일반적으로 오류 처리에 사용됩니다.

예를 들어보세요:

으아악

MyError에 대한 포인터와 MyError 的指针和 error 接口之间的关系发生在幕后,您不需要显式返回 *error 即可从 MyError 值引用 error 인터페이스 간의 관계는 배후에서 발생하므로 MyError에서 값을 가져오기 위해 명시적으로 <code>*error를 반환할 필요가 없습니다. 참조 (사실 인터페이스에 대한 포인터가 거의 필요하지

).

myFunction 后,error 值将保存以下元组 (V=&MyError{message: "my error message", Offset: 0}, T=*MyError),其中 V 是它的值保持,T 是值 VmyFunction을 반환한 후

값은 다음 튜플 (V=&MyError{message: "my error message", Offset: 0}, T=*MyError)를 저장합니다. , 여기서 V는 Hold 값이고 TV 값의 유형입니다.

e, ok := err.(*MyError) 是: err 值(哪种类型是 error 接口)是否将类型 *MyError 作为其底层 T?如果是这样,则 ok 将是 true,并且 e 将接收其底层 V&MyError{message: "我的错误消息", Offset: 0}Go를 사용하면 인터페이스 값에 대한 어설션을 입력할 수 있기 때문입니다. 기본적으로 Go 작업 e, ok := err.(*MyError)에 대해 묻는 것은 err 값(어떤 유형이

인터페이스인지)입니다. 기본 T로 *MyError 유형이 될까요? 그렇다면 oktrue가 되고 e는 기본 V&MyError {message를 수신합니다. : "내 오류 메시지", 오프셋: 0}.

참고nil: 오류 값을 주의해서 처리하세요. 인터페이스의 미묘한 차이로 인해 오류 값이 항상 예상대로 작동하지 않을 수도 있기 때문입니다

. 🎜

위 내용은 Go가 오류 래퍼에 대한 포인터를 반환하지만 "*error" 대신 "error"로 선언하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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