>백엔드 개발 >Golang >Go에서 리플렉션을 사용하여 인터페이스 변수의 포인터 유형과 값을 어떻게 변경할 수 있나요?

Go에서 리플렉션을 사용하여 인터페이스 변수의 포인터 유형과 값을 어떻게 변경할 수 있나요?

DDD
DDD원래의
2024-11-17 11:05:02647검색

How can I change the pointer type and value of an interface variable using reflection in Go?

리플렉션이 있는 인터페이스에서 포인터 유형 및 값 변경

질문

포인터 유형 및 값을 어떻게 변경할 수 있습니까? 다음을 사용하여 인터페이스에 의해 정의된 변수 리플렉션?

답변

Go에서는 인터페이스를 포함한 모든 것이 값으로 전달됩니다. 인터페이스 값을 할당할 때 복사본이 생성되어 수정 가능성이 제한됩니다.

인터페이스 변수에 저장된 값을 수정하려면 해당 주소를 사용해야 합니다. Reflect.ValueOf(&varName).Elem()을 통해 변수의 주소에 액세스하면 변수에 새 포인터 값을 설정할 수 있습니다.

var a fmt.Stringer // Interface variable
a = &Greeter{"John"}

v := reflect.ValueOf(&a).Elem() // Access variable's address
v.Set(reflect.ValueOf(&Greeter2{"Jack"})) // Set new pointer value

fmt.Println(a.String()) // Hello2, My name is Jack (Greeter2.String() called)

핵심

  • 다음 주소부터 시작하세요. Reflect.ValueOf(&varName).
  • 포인터로 구현된 인터페이스는 복사본으로 설정할 수 없으므로 포인터 값을 설정하세요.

제한 사항

  • Go의 값 전달 특성으로 인해 복사본 수정이 불가능합니다. 포인터를 전달해야만 가리키는 값을 수정할 수 있어 변수의 값을 효과적으로 변경할 수 있습니다.
  • 변수의 실제 유형은 컴파일 타임에 결정되므로 변수의 인터페이스 유형을 변경할 수 없습니다.

위 내용은 Go에서 리플렉션을 사용하여 인터페이스 변수의 포인터 유형과 값을 어떻게 변경할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.