2017-02-27 41 views
0

何らかの理由で、リフレクションを使用してスライスに新しい要素を追加しても、スライス自体は更新されないようです。これは実証するコードです:反射を使用してスライスに移動する追加

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 
} 

遊び場リンク:https://play.golang.org/p/j3532H_mUL

は、私がここに欠けている何かありますか?

答えて

2

reflect.Appendは、新しいスライス値を返す点でappendのように機能します。

appendToSlice関数の変数valueにこの値を割り当てます。これは、前のreflect.Valueを置き換えますが、元の引数は更新しません。

、何が起こっているのか、それがより明確に反射することなく、あなたの例と同等の機能を取るために:あなたが使用する必要がどのような

func appendToSlice(arrPtr *[]int) { 
    value := *arrPtr 
    value = append(value, 55) 
    fmt.Println(len(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()) 
} 

https://play.golang.org/p/Nhabg31Sju

関連する問題