Go에서는 인터페이스 인수를 사용하여 함수를 정의할 수 있습니다. nil이 아닌 인터페이스 값을 전달하는 것은 간단하지만 다음과 같은 질문이 생깁니다. == nil 검사를 통과하도록 리플렉션을 통해 nil 값을 어떻게 전달합니까?
다음 함수를 고려하세요.
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // how to get here? } else { fmt.Println("NOT NIL :(") } }
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil) }
이 접근 방식은 다음과 같이 실패합니다. Reflect.Zero(reflect.TypeOf((error)(nil)))는 nil 유형의 0 값을 생성할 수 없기 때문에 패닉이 발생합니다.
type MyError struct{} func (e MyError) Error() string { return "" } func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :( }
이 접근 방식은 인터페이스 유형이 nil이거나 특정 유형을 가리킬 수 있음을 나타내는 nil 오류에 대한 Go FAQ 항목으로 인해 실패합니다. 특별히 nil을 전달하는 것은 정상이 아닙니다. nil 인터페이스에서 메서드를 호출하려고 하면 패닉이 발생합니다.
nil을 올바르게 전달하려면 사용하세요. 리플렉션을 통해 값을 얻으려면 Reflect.TypeOf((*error)(nil)).Elem() 표현식을 사용하여 오류 인터페이스에 대한 Reflect.Type을 가져옵니다. 이 표현식은 비인터페이스 값을 생성하고 리플렉션 메서드를 사용하여 원하는 Reflect.Type을 얻습니다.
다음과 같이 nilArg를 생성합니다.
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
이 접근 방식을 사용하면 nilArg로 f를 호출하면 인쇄됩니다. "YEY! NIL."
실제 구현을 보려면 플레이그라운드 예시를 참조하세요.
위 내용은 Go에서 리플렉션을 사용하여 Nil 인터페이스 값을 어떻게 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!