Go 인터페이스에서 Nil 슬라이스의 특이한 동작
Go에서 슬라이스에는 빈 슬라이스를 의미하는 nil 값이 할당될 수 있습니다. 그러나 nil 슬라이스가 인터페이스를 기대하는 함수에 인수로 전달되면{} 동작에 놀라운 차이가 나타납니다.
다음 Go 놀이터를 고려해 보세요.
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
위의 예에서 두 함수 yes와 no는 인수와 동일한 nil 슬라이스를 받습니다. 그러나 두 함수의 출력은 다릅니다. yes는 true를 인쇄하여 슬라이스가 실제로 nil임을 나타냅니다. 아니요, 반면에 거짓으로 인쇄됩니다.
왜 이러한 불일치가 발생합니까? 답은 Go 인터페이스에서 내부적으로 nil 슬라이스가 표시되는 방식에 있습니다.
다양한 유형을 나타내는 데 사용되는 인터페이스{} 변수는 유형과 데이터 포인터라는 두 가지 필드로 구성됩니다. nil 슬라이스가 인터페이스{}를 기대하는 함수에 전달되면 인터페이스{} 유형으로 래핑되고 데이터 포인터가 nil로 설정됩니다.
yes인 경우 직접 비교합니다. nil에 대한 인수로 슬라이스 자체가 nil인지 효과적으로 묻습니다. 슬라이스가 실제로 비어 있으므로 이 비교는 true를 반환합니다.
그러나 no 함수는 인터페이스{}에 래핑된 nil 슬라이스를 수신합니다. 이 경우 비교는 슬라이스와 nil 사이뿐만 아니라 전체 인터페이스{}와 nil 사이에서도 이루어집니다. 런타임 내에서 이 비교는 인터페이스{}의 데이터 포인터가 nil인지 여부를 테스트하는 것으로 요약됩니다. 이는 인터페이스 래퍼가 이에 대한 메모리를 할당했기 때문에 false입니다.
이 동작은 Go의 FAQ에도 문서화되어 있습니다.
"인터페이스에 전달된 nil 슬라이스의 일반적인 문제: nil 슬라이스는 nil 인터페이스 값으로 표시되므로 i == nil이면 인터페이스 i(nil 인터페이스)의 값을 테스트할 때 쓰기가 성공할 수 없습니다. 거짓입니다)."
위 내용은 Go에서 Nil 슬라이스가 인터페이스에 전달될 때 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!