>백엔드 개발 >Golang >Go에서 Nil 인터페이스를 포인터로 안전하게 변환하는 방법은 무엇입니까?

Go에서 Nil 인터페이스를 포인터로 안전하게 변환하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-19 14:01:16184검색

How to Safely Convert a Nil Interface to a Pointer in Go?

GoLang에서 Nil 인터페이스-포인터 변환 오류

GoLang에서 다음과 같이 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
}

이 오류는 다음과 같은 정적 유형 변수 때문에 발생합니다. 인터페이스 유형(예: Nexter)은 nil을 포함한 다양한 동적 유형의 값을 보유할 수 있습니다. (*Node)(nil)을 사용하여 nil 값을 포인터로 변환하는 것이 가능하지만 다음과 같은 이유로 예제에 사용된 유형 어설션을 적용할 수 없습니다.

x.(T)

x는 non-이어야 합니다. nil 및 T 유형입니다. 이 경우 p는 다양한 유형 또는 nil의 값을 포함할 수 있습니다.

대신 명시적 검사는 다음을 수행할 수 있습니다. 취업:

if p != nil {
    n = p.(*Node) // succeeds if p contains a *Node value
}

또는 "comma-ok" 형식이 더 안전한 옵션을 제공합니다:

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)
}

"comma-ok" 형식을 사용하면 nil과 non을 모두 처리할 수 있습니다. -패닉을 유발하지 않고 인터페이스 값이 없습니다.

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

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