>백엔드 개발 >Golang >Reflection의 `Append` 기능이 원본 Go 슬라이스를 업데이트하지 않는 이유는 무엇입니까?

Reflection의 `Append` 기능이 원본 Go 슬라이스를 업데이트하지 않는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-26 01:10:12578검색

Why Doesn't Reflection's `Append` Function Update the Original Go Slice?

Go 리플렉션에 함수 추가

Go에서는 리플렉션을 사용하여 슬라이스에 요소를 추가해도 원본 슬라이스가 업데이트되지 않는 것 같습니다. 이는 다음 코드에 설명되어 있습니다.

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의 동작에 있습니다. 기존의 추가 함수와 마찬가지로 새로운 슬라이스 값을 반환합니다. 이 경우 값 변수에 할당된 값이 이 새 조각으로 대체되어 효과적으로 복사본이 생성됩니다.

설명을 위해 현재 상황을 강조하기 위해 예시를 수정해 보겠습니다.

func appendToSlice(arrPtr *[]int) {
    value := *arrPtr
    value = append(value, 55)
    fmt.Println(len(value))
}

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

이 수정된 코드는 사용하지 않더라도 동일한 출력을 생성합니다. Reflection.

해결책

반사를 사용하여 슬라이스에 올바르게 추가하려면 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에 전달하여 원본 슬라이스를 업데이트합니다.

위 내용은 Reflection의 `Append` 기능이 원본 Go 슬라이스를 업데이트하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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