2017-02-27 53 views
0

出于某种原因,使用反射向切片添加新元素似乎不会更新切片本身。这是代码来演示:使用反射追加到lang切片

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