Golang에서는 nil 값을 인터페이스 유형에 직접 할당할 수 없습니다. 이는 nil이 값이 없음을 나타내는 반면 인터페이스는 값에 대한 포인터를 나타내기 때문입니다. 인터페이스 인수에 nil 값을 전달하려고 하면 프로그램은 인수가 nil인지 확인하고 오류를 반환하거나 예기치 않은 방식으로 동작할 수 있습니다.
이 문제를 회피하려면 리플렉션을 사용하여 nil을 생성할 수 있습니다. 인터페이스 인수에 전달되고 nil 검사를 통과할 수 있는 값입니다. Reflection을 사용하면 변수의 기본 유형과 값에 프로그래밍 방식으로 액세스할 수 있습니다.
해결책:
reflect.TypeOf((*error)(nil)).Elem 표현식을 사용하세요. () 인터페이스 오류에 대한 Reflect.Type을 가져옵니다. 이 표현식은 올바른 Reflect.Type을 얻기 위해 인터페이스가 아닌 값인 *error를 사용합니다. 이어서 오류에 대한 Reflect.Type을 가져오기 위해 결과에 대해 Elem이 호출됩니다.
nilArg를 생성하려면 다음 표현식을 사용합니다.
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
이 표현식은 유형의 nil 값을 생성합니다. 오류. 원래 문제는 nil 인터페이스 값의 구체적인 유형이 nil이므로 Reflect.TypeOf((error)(nil))가 nil을 반환했기 때문에 발생했습니다.
예:
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem()) rf.Call([]reflect.Value{nilArg}) }
이 솔루션을 사용하면 f 함수가 nil 값을 수신하고 == nil 검사를 통과할 수 있습니다.
위 내용은 Go의 Reflection은 인터페이스 인수에 Nil 값 전달을 어떻게 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!