Nil 인터페이스 인스턴스 비교
아래 코드를 고려하세요.
<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) // Displays "Error is not nil" }</code>
놀랍게도 이 코드의 결과는 " nil 조건을 테스트하려는 의도에도 불구하고 오류는 nil이 아닙니다.
이 동작을 이해하는 열쇠는 Go가 인터페이스를 구현하는 방법에 있습니다. 내부적으로 인터페이스 값은 유형과 값으로 구성됩니다. 값은 nil일 수 있지만 유형은 nil이 될 수 없습니다. 주어진 예에서 (*Goof)(nil)은 "*Goof" 유형과 nil 값을 갖는 인터페이스 값입니다.
그러나 오류 인터페이스 유형은 "*Goof" 유형과 다릅니다. 따라서 (*Goof)(nil) 및 error(nil)는 둘 다 nil 값을 포함하더라도 동일하지 않습니다. 이는 다음 코드에서 분명하게 드러납니다.
<code class="go">var g *Goof // nil var e error = g if e == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } // Output: Error is not nil</code>
이 문제를 해결하려면 여러 가지 접근 방식이 있습니다.
위 내용은 Go에서 `nil` 인터페이스 값이 `error(nil)`와 같지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!