ホームページ >バックエンド開発 >Golang >Reflection Update が直接スライスに移行しないのはなぜですか?これはどのように修正できますか?

Reflection Update が直接スライスに移行しないのはなぜですか?これはどのように修正できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-25 20:19:10836ブラウズ

Why Doesn't Reflection Update Go Slices Directly, and How Can This Be Fixed?

リフレクションを使用した GoSlice の更新: 不一致の検査

Go プログラミングのコンテキストでは、リフレクション パッケージは、次の値を操作するための強力なメカニズムを提供します。ランタイム。一般的な使用例の 1 つは要素をスライスに追加することであり、これは動的プログラミングのシナリオで特に役立ちます。ただし、リフレクションを使用して要素をスライスに追加すると、必ずしも元のスライスが更新されるわけではなく、予期しない結果が生じる可能性があることが観察されています。

この現象を説明するには、次のコード スニペットを考えてみましょう。

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
}
````

In this example, a slice `arr` is initially empty. The `appendToSlice` function takes a pointer to the slice as an argument and uses reflection to append the value 55 to the slice. The `value.Len()` statement within `appendToSlice` confirms that the reflection operation successfully appends the element. However, when the length of the original `arr` slice is printed in the `main` function, it still returns 0.

The reason for this discrepancy lies in the way that reflection operates. `reflect.Append` returns a new slice value, rather than modifying the existing one. Assigning the newly created slice value to the variable `value` within `appendToSlice` does not update the original slice `arr`.

To address this issue, the `reflect.Value.Set` method can be utilized to update the original value in place:

func appendToSlice(arrPtr インターフェース{}) {

valuePtr := reflect.ValueOf(arrPtr)
value := valuePtr.Elem()

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

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

}

In this modified version, after appending the new element using reflection, the `value.Set` method is used to update the original slice. This ensures that the changes made using reflection are reflected in the original slice, producing the expected output:

以上がReflection Update が直接スライスに移行しないのはなぜですか?これはどのように修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。