douhui8025 2017-02-27 19:39
浏览 24
已采纳

使用反射附加去朗片

For some reason, it appears that adding new element to slice using reflection doesn't update slice itself. This is the code to demonstrate:

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
}

Playground link : https://play.golang.org/p/j3532H_mUL

Is there something I'm missing here?

  • 写回答

2条回答 默认 最新

  • donglin6313 2017-02-27 19:44
    关注

    reflect.Append works like append in that it returns a new slice value.

    You are assigning this value to the value variable in the appendToSlice function, which replaces the previous reflect.Value, but does not update the original argument.

    To make it more clear what's happening, take the equivalent function to your example without reflection:

    func appendToSlice(arrPtr *[]int) {
        value := *arrPtr
        value = append(value, 55)
        fmt.Println(len(value))
    }
    

    What you need to use is the Value.Set method to update the original value:

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题