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 중국어 웹사이트의 기타 관련 기사를 참조하세요!