2017-02-27 54 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