首頁 >後端開發 >Golang >為什麼 Reflection 的 `reflect.Append` 沒有修改原來的 Go Slice,如何修復?

為什麼 Reflection 的 `reflect.Append` 沒有修改原來的 Go Slice,如何修復?

DDD
DDD原創
2024-11-23 09:49:18957瀏覽

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

使用反射附加到Golang 切片:全面探索

問題陳述:

問題陳述:
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
}

問題陳述:

問題陳述:

問題陳述:

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

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

    fmt.Println(value.Len())
}

問題陳述:

問題陳述:

問題陳述:中GoGo🎜>中Go ,當嘗試使用反射將元素附加到切片時,原始切片保持不變。下面的程式碼示範了這一點:理解行為:reflect.Append 函數的操作與內建追加函數類似,傳回一個新的切片值。在提供的範例中,程式碼將返回值分配給appendToSlice函數內的value變量,有效地替換了先前的reflect.Value。但是,這不會修改原始參數。 使用反射追加的正確方法:要使用反射將元素追加到原始切片,Value.Set應採用方法。以下是修改後的程式碼:透過使用 Value.Set,value 變數將使用附加的切片值進行更新,然後反映在 arrPtr 參數引用的原始切片中。 結論:使用反射追加到Go切片需要使用Value.Set方法修改原始切片。 Reflect.Append 函數傳回一個新的切片值,必須使用 Value.Set 將其指派給原始切片。這確保了反射範圍內所做的變更反映在原始切片中。

以上是為什麼 Reflection 的 `reflect.Append` 沒有修改原來的 Go Slice,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn