> 백엔드 개발 > Golang > Go에서 Nil 인터페이스를 포인터로 변환하는 데 실패하는 이유는 무엇입니까?

Go에서 Nil 인터페이스를 포인터로 변환하는 데 실패하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-30 13:08:11
원래의
452명이 탐색했습니다.

Why Does a Nil Interface to Pointer Conversion Fail in Go?

Go에서 Nil 인터페이스를 포인터로 변환

Go에서 인터페이스 유형은 이를 구현하는 다양한 구체적인 유형의 값을 보유할 수 있습니다. 그러나 nil 인터페이스를 특정 유형의 포인터로 변환하려고 시도하면 "인터페이스 변환: 인터페이스가 *이 아니라 nil입니다."라는 오류가 발생할 수 있습니다. 이 오류는 인터페이스를 특정 유형으로 변환하는 데 사용되는 유형 어설션에 nil이 아닌 인터페이스 값이 필요하기 때문에 발생합니다.

이 동작을 이해하려면 질문의 코드 조각을 고려하세요.

type Nexter interface {
    Next() Nexter
}

type Node struct {
    next Nexter
}

func (n *Node) Next() Nexter {...}

func main() {
    var p Nexter
    var n *Node
    fmt.Println(n == nil)  // True
    n = p.(*Node)       // Error: interface conversion: interface is nil, not *main.Node
}
로그인 후 복사

유형 주장 p.(*Node)를 사용하여 p 값을 n에 할당하려고 할 때 문제가 발생합니다. p 변수가 nil이기 때문에 이 어설션은 실패합니다. 이는 구체적인 값을 보유하지 않음을 나타냅니다.

또는 다음 표현식은

n = (*Node)(nil)
로그인 후 복사

n 변수를 명시적으로 다음으로 설정하기 때문에 성공합니다. *Node 유형의 nil 포인터. 이는 인터페이스 값이 (값, 동적 유형)의 쌍으로 구성되며, 인터페이스 값을 nil로 설정하면 (nil, nil) 쌍이 되기 때문에 가능합니다.

nil 인터페이스 값을 처리하려면, 명시적으로 확인할 수 있습니다:

if p != nil {
    n = p.(*Node)  // Only succeeds if `p` holds a value of type `*Node`
}
로그인 후 복사

또는 "comma-ok" 형식의 유형을 사용할 수도 있습니다. 주장:

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)  // Never fails, assigns zero value to `n` if `p` is nil
}
로그인 후 복사

결론적으로 유형 주장을 사용하여 nil 인터페이스를 특정 유형의 포인터로 변환하려는 시도는 실패하지만 명시적으로 nil로 설정하면 성공합니다. nil 인터페이스 값을 처리하려면 명시적 검사나 "comma-ok" 형식의 유형 어설션을 사용할 수 있습니다.

위 내용은 Go에서 Nil 인터페이스를 포인터로 변환하는 데 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿