>백엔드 개발 >Golang >Reflection의 `reflect.Append`가 원래 Go 슬라이스를 수정하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Reflection의 `reflect.Append`가 원래 Go 슬라이스를 수정하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-11-23 09:49:18907검색

Why Doesn't Reflection's `reflect.Append` Modify the Original Go Slice, and How Can I Fix It?

Reflection을 사용하여 Golang 슬라이스에 추가: 포괄적인 탐색

문제 설명:

In Go, 리플렉션을 사용하여 슬라이스에 요소를 추가하려고 하면 원본 슬라이스가 변경되지 않고 그대로 유지됩니다. 이는 아래 코드에서 설명됩니다.

package main

import (
    "fmt"
    "reflect"
)

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()
    value = reflect.Append(value, reflect.ValueOf(55))

    fmt.Println(value.Len()) // prints 1
}

func main() {
    arr := []int{}
    appendToSlice(&arr)
    fmt.Println(len(arr)) // prints 0
}

동작 이해:

reflect.Append 함수는 다음을 반환하여 내장 추가 함수와 유사하게 작동합니다. 새로운 슬라이스 값. 제공된 예제에서 코드는 반환된 값을appendToSlice 함수 내의 value 변수에 할당하여 이전의 Reflect.Value를 효과적으로 대체합니다. 그러나 이는 원래 인수를 수정하지 않습니다.

리플렉션을 사용하여 추가하는 올바른 접근 방식:

리플렉션을 사용하여 원본 슬라이스에 요소를 추가하려면 Value.Set 방법을 채택해야 한다. 수정된 코드는 다음과 같습니다.

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()

    value.Set(reflect.Append(value, reflect.ValueOf(55)))

    fmt.Println(value.Len())
}

Value.Set을 사용하면 value 변수가 추가된 슬라이스 값으로 업데이트된 다음 arrPtr 인수가 참조하는 원본 슬라이스에 반영됩니다.

결론:

리플렉션을 사용하여 Go 슬라이스에 추가하려면 Value.Set 메서드를 사용해야 합니다. 원본 슬라이스를 수정합니다. Reflect.Append 함수는 Value.Set을 사용하여 원래 슬라이스에 할당해야 하는 새 슬라이스 값을 반환합니다. 이렇게 하면 반사 범위 내에서 변경된 내용이 원본 슬라이스에 반영됩니다.

위 내용은 Reflection의 `reflect.Append`가 원래 Go 슬라이스를 수정하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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