dongtang6718 2016-04-14 13:35
浏览 47
已采纳

开始-通过反射附加到[] interface {}

Without reflection it is possible to add multiple types to a list of type []interface{}. Like so:

package main

import "fmt"

func main() {
    var foo []interface{}
    foo = append(foo, "Test")
    foo = append(foo, "Foo")
    foo = append(foo, 10)
    fmt.Printf("%v
", foo)
}

Is this possible with reflection? I try the following but I get a panic saying: "panic: reflect.Set: value of type string is not assignable to type []interface {}"

package main

import (
    "fmt"
    "reflect"
)

func rf(inf interface{}) {
    val := reflect.Indirect(reflect.ValueOf(inf))
    field := val.FieldByName("Foo")
    rslice := reflect.MakeSlice(reflect.SliceOf(field.Type()), 0, 5)
    v := reflect.Indirect(reflect.ValueOf("Test"))
    rslice = reflect.Append(rslice, v)
}

func main() {
    var s struct {
        Foo []interface{}
    }
    rf(&s)
    fmt.Printf("%+v
", s)
}
  • 写回答

1条回答 默认 最新

  • doufei7516 2016-04-14 13:44
    关注

    The Foo field is already of type []interface{}, so SliceOf is creating a [][]interface{}, which is what causes the error you see.

    Remove the SliceOf, and then use field.Set(rslice) to set the new value back to the struct field.

    func rf(inf interface{}) {
        val := reflect.Indirect(reflect.ValueOf(inf))
        field := val.FieldByName("Foo")
        rslice := reflect.MakeSlice(field.Type(), 0, 5)
        v := reflect.Indirect(reflect.ValueOf("Test"))
        rslice = reflect.Append(rslice, v)
        field.Set(rslice)
    }
    

    http://play.golang.org/p/gWK3-cP_MN

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测