리플렉션을 사용하여 값에 대한 포인터 가져오기
인터페이스의 필드를 검사하려면 Go에서 리플렉션을 사용해야 합니다. 그러나 포인터가 아닌 필드의 주소를 검색하려고 하면 문제가 발생합니다. 이 문서에서는 이러한 과제를 해결하고 솔루션을 제공합니다.
제공된 코드 샘플에서 InspectStruct라는 함수는 지정된 구조를 탐색하고 각 필드에 대한 세부 정보를 출력합니다. 대부분의 필드는 설명되지만 구조 내의 상위 수준에 포함된 포인터가 아닌 필드는 "주소 지정 불가능" 결과를 생성합니다.
해결책
문제는 Reflect.Value.Interface() 메소드 사용. 포인터가 아닌 필드의 주소를 얻으려면 인터페이스{} 대신 Reflect.Value를 InspectStruct 함수에 전달하는 것이 좋습니다. 아래의 수정된 코드에는 이 변경 사항이 포함되어 있습니다.
<code class="go">func InspectStructV(val reflect.Value) { // ... (remaining code is identical) } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
이 수정을 통해 InspectStruct 함수는 의도한 대로 작동하여 깊이나 포인터 상태에 관계없이 구조 내 모든 필드의 주소를 생성합니다. 이는 업데이트된 테스트 결과에서 확인할 수 있습니다.
Field Name: Id, Field Value: 1, Address: 0x408125440 , Field type: int , Field kind: int Field Name: F, Field Value: {2 {3}}, Address: 0x408125444 , Field type: main.V , Field kind: struct Field Name: Id, Field Value: 2, Address: 0x408125450 , Field type: int , Field kind: int Field Name: F, Field Value: {3}, Address: 0x408125458 , Field type: main.Z , Field kind: struct Field Name: Id, Field Value: 3, Address: 0x408125460 , Field type: int , Field kind: int
위 내용은 Go에서 리플렉션을 사용하여 값에 대한 포인터를 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!