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

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

Barbara Streisand
풀어 주다: 2024-12-04 08:01:12
원래의
255명이 탐색했습니다.

How to Safely Convert Nil Interfaces to Pointers in Go?

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

Go에서 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) // prints true
    n = p.(*Node) // fails
}
로그인 후 복사

정적 인터페이스(Nexter)가 nil을 포함한 다양한 동적 유형의 값을 보유할 수 있기 때문에 이는 실패합니다. nil 인터페이스 값에 대해 유형 주장(p.(*Node))을 수행할 수 없습니다.

그러나 특정 유형의 포인터에 nil 값을 직접 할당하는 것은 가능합니다:

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

동적 유형 *Node를 사용하여 nil 값을 n에 할당합니다.

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

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

또는 "comma-ok" 형식을 사용합니다.

if n, ok := p.(*Node); ok {
    // n is not nil and holds a value of type *Node
}
로그인 후 복사

"comma-ok" 형식을 사용하면 어설션이 절대 실패하지 않고 나타내는 부울 값이 반환됩니다. 패닉을 일으키지 않고 주장이 유효한지 여부. 이를 통해 nil 및 non-nil 인터페이스 값을 모두 안전하게 처리할 수 있습니다.

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

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