>  기사  >  백엔드 개발  >  Go에서 Nil 슬라이스가 인터페이스에 전달될 때 다르게 동작하는 이유는 무엇입니까?

Go에서 Nil 슬라이스가 인터페이스에 전달될 때 다르게 동작하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 05:32:02228검색

Why Does a Nil Slice Behave Differently When Passed to an Interface in Go?

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

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