>  기사  >  백엔드 개발  >  리플렉션을 사용하여 구조를 반복적으로 반복하고 필드를 설정합니다.

리플렉션을 사용하여 구조를 반복적으로 반복하고 필드를 설정합니다.

WBOY
WBOY앞으로
2024-02-10 20:45:10585검색

리플렉션을 사용하여 구조를 반복적으로 반복하고 필드를 설정합니다.

이 기사에서 PHP 편집기 Xigua는 리플렉션을 사용하여 구조를 재귀적으로 반복하고 필드를 설정하는 방법을 소개합니다. 리플렉션은 런타임에 클래스, 메서드, 속성 등과 같은 정보를 얻고 조작할 수 있게 해주는 PHP의 강력한 기능입니다. 재귀적 반복 구조는 복잡한 데이터 구조를 탐색하고 작동하는 데 도움이 되는 일반적인 처리 방법입니다. 리플렉션과 재귀 반복 구조를 결합하면 필드 값을 쉽게 가져오고 설정할 수 있어 더욱 유연하고 효율적인 프로그래밍이 가능해집니다. 다음 콘텐츠에서는 독자가 이 기술을 더 잘 이해하고 적용할 수 있도록 이 프로세스를 자세히 소개합니다.

질문 내용

Reflection을 사용하여 구조체의 필드를 설정하는 프로그램을 만들고 싶습니다. 최상위 필드에서 작동하도록 설정했지만 중첩된 구조체 필드로 인해 어려움을 겪고 있습니다. 중첩된 구조체 필드를 반복하는 방법은 무엇입니까?

type Payload struct {
    Type    string   `json:"type"`
    SubItem *SubItem `json:"sub_item"`
}

type SubItem struct {
    Foo string `json:"foo"`
}

func main() {
    var payload Payload
    setValue(&payload, "type", "test1")
    setValue(&payload, "sub_item.foo", "test2")
}

func setValue(structPtr interface{}, key string, value string) {
    structValue := reflect.Indirect(reflect.ValueOf(structPtr))
    for i, subkey := range strings.Split(key, ".") {
        isLast := i == len(strings.Split(key, "."))-1
        var found bool
        // this line is crashing with "reflect: call of reflect.Value.NumField on zero Value"
        for i := 0; i < structValue.NumField(); i++ {
            field := structValue.Type().Field(i)
            jsonTags := strings.Split(field.Tag.Get("json"), ",")
            if jsonTags[0] == subkey {
                found = true
                if isLast {
                    if isLast {
                        // last element
                        // TODO set value
                        fmt.Printf("TODO set value %s to %v", value, structValue)
                        structValue = reflect.Indirect(reflect.ValueOf(structPtr))
                    }
                } else {
                    structValue = reflect.Indirect(reflect.ValueOf(structValue.Field(i).Interface()))
                }
                break
            }
        }
        if !found {
            panic(fmt.Errorf("failed to find field %s", key))
        }
    }
}

해결 방법

이 기능을 사용하세요:

으아악

findjsonfield 함수는 필드의 json 태그를 통해 구조 필드를 찾습니다.

으아악

https://www.php.cn/link/e4848ea6b69df2c66c87e2877e74726b

위 내용은 리플렉션을 사용하여 구조를 반복적으로 반복하고 필드를 설정합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제