Go의 인터페이스 및 유형 비교
Go에서 인터페이스는 다양한 유형이 구현할 수 있는 공통 메소드 세트를 정의하는 방법을 제공합니다. 그러나 예상치 못한 동작을 방지하려면 인터페이스 비교가 어떻게 작동하는지 이해하는 것이 중요합니다.
다음 코드를 고려하세요.
<code class="go">type Goof struct {} func (goof *Goof) Error() string { return fmt.Sprintf("I'm a goof") } func TestError(err error) { if err == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } } func main() { var g *Goof // nil TestError(g) // expect "Error is nil" }</code>
이 예에서는 오류 인터페이스를 구현하는 사용자 정의 유형 Goof를 만듭니다. . 그런 다음 *Goof 유형의 nil 포인터를 오류가 예상되는 TestError 함수에 전달합니다. 반직관적으로 프로그램은 "Error is nil"을 인쇄하지 않습니다.
인터페이스 비교는 값뿐만 아니라 유형도 확인하기 때문입니다. 이 경우 *Goof의 nil 인스턴스는 오류 인터페이스와 다른 유형입니다. 따라서 err == nil 비교가 실패합니다.
이 문제를 극복하기 위한 몇 가지 옵션이 있습니다. 하나는 err을 오류 유형의 변수로 직접 선언하는 것입니다.
<code class="go">var err error = g</code>
또 다른 옵션은 오류가 발생할 경우 함수에서 nil을 반환하는 것입니다.
<code class="go">func MyFunction() error { // ... if errorOccurred { return nil } // ... }</code>
인터페이스 비교 방법을 이해함으로써 작업을 수행하면 잠재적인 함정을 피하고 더욱 효과적인 Go 코드를 작성할 수 있습니다.
위 내용은 Go에서 nil 인터페이스를 'nil'과 비교하는 데 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!