>  기사  >  백엔드 개발  >  Go에서 인터페이스에 전달된 Nil 슬라이스가 Nil과 같지 않은 이유는 무엇입니까?

Go에서 인터페이스에 전달된 Nil 슬라이스가 Nil과 같지 않은 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-04 01:28:03275검색

Why Does a Nil Slice Passed to an Interface in Go Not Equal Nil?

Go 인터페이스의 nil Slice Paradox 이해

nil 슬라이스를 인터페이스로 전달할 때 결과가 nil이 아닌 이유는 무엇입니까? 이 수수께끼 같은 동작은 Go 인터페이스의 기본 구현을 이해함으로써 설명할 수 있습니다.

Go에서 인터페이스{} 변수는 기본적으로 다음과 같이 유형 설명자와 데이터 값으로 구성된 이중 필드 구조입니다. Iface struct:

struct Iface {
    Itab*   tab;
    void*   data;
};

이제 제공된 코드에서 두 함수 호출을 분석해 보겠습니다.

<code class="go">yes([]int{}) // output: true
no([]int{})  // output: false</code>

yes 함수:

In yes 함수에서는 []int{} 값이 매개변수로 전달됩니다. yes는 슬라이스 매개변수만 허용하므로 컴파일러는 nil을 값이 0인 슬라이스로 처리합니다. 따라서 비교 항목 == nil은 nil == nil이 되어 true를 반환합니다.

no 함수:

반면, no 함수는 인터페이스를 기대합니다.{} 매개변수. []int{} 값을 전달하면 Go는 자동으로 이를 인터페이스{} 유형으로 래핑합니다. 효과적으로 인터페이스{[]int, nil}로 변환합니다. 비교 항목 == nil은 이제 인터페이스{[]int, nil} == nil로 평가되어 false를 생성합니다.

이 동작은 Go FAQ에서 더 명확하게 설명됩니다. 모든 멤버가 nil이면 nil과 같습니다."(즉, 이 예의 경우 []int(형식 멤버)는 nil이 될 수 없습니다.)

따라서 인터페이스에서 nil 슬라이스를 처리할 때는 다음과 같습니다. 이 특이한 점을 인식하고 동작을 올바르게 해석하려면 기본 구현을 고려하는 것이 중요합니다.

위 내용은 Go에서 인터페이스에 전달된 Nil 슬라이스가 Nil과 같지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.