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