Golang에서 Nil 인터페이스를 특정 유형의 포인터로 변환
nil 인터페이스를 특정 유형의 포인터로 변환하려고 하면 오류 발생: "인터페이스 변환: 인터페이스가 nil입니다." 이것이 실패하는 이유를 이해하려면 정적 유형과 동적 유형의 차이점을 파악하는 것이 중요합니다.
Nexter는 정적 유형을 지정하는 인터페이스입니다. Nexter 유형의 변수는 *Node 또는 기타 사용자 정의 유형과 같이 Nexter 인터페이스를 구현하는 다양한 동적 유형의 값을 보유할 수 있습니다. nil 인터페이스 변수가 포인터 변수에 할당되면 해당 변수가 보유하는 값의 실제 동적 유형을 결정하는 것이 불가능합니다(아무 것도 보유하지 않기 때문에).
결과적으로 일반적으로 다음에서 사용되는 유형 어설션은 x가 T 유형이라고 주장하고 이를 T로 캐스팅하는 x.(T) 형식은 실패합니다. 이는 Go 언어 사양에 x.(T)가 x가 nil이 아닌 경우에만 작동한다고 명시적으로 명시되어 있기 때문입니다. nil 인터페이스 변수에 유형 어설션을 사용하면 런타임 패닉이 발생합니다.
n = p.(*Node)와 유사한 효과를 얻으려면 nil 인터페이스에서 시작하여 다음 접근 방식을 사용할 수 있습니다.
var p Nexter = (*Node)(nil)
인터페이스 값은 실제로 (값, 동적 유형) 쌍을 보유합니다. 이 경우 p는 nil이 아니지만 (nil, *Node) 쌍을 보유합니다. 이를 통해 p에 대한 유형 어설션이 성공할 수 있습니다.
또는 nil 값을 명시적으로 처리하려면 "comma-ok" 형식을 사용하세요.
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
"comma-ok" 형식을 사용하면 다음이 보장됩니다. 런타임 패닉이 발생하지 않으며, 어설션이 실패하면 ok는 false가 됩니다(즉, p는 nil 값 또는 다른 유형의 값을 보유함).
위 내용은 Go에서 Nil 인터페이스를 포인터로 안전하게 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!