如何使用反射在Golang中创建具有给定名称(字符串)的数组

8

我想在golang中使用名字创建数组,但是遇到了一些错误。 下面是我的代码: package main

import (
    "fmt"
    "reflect"
)

type My struct{
    Name string
    Id int
}

func main() {
    my := &My{}
    myType := reflect.TypeOf(my)
    fmt.Println(myType)
    //v := reflect.New(myType).Elem().Interface()

    // I want to make array  with My
    //a := make([](myType.(type),0)  //can compile
    //a := make([]v.(type),0)  ////can compile
    fmt.Println(a)
}
2个回答

9
我相信这就是你想要的:
 slice := reflect.MakeSlice(reflect.SliceOf(myType), 0, 0).Interface()

实例:

另外需要注意的是,在大多数情况下,一个空切片比容量为零的切片更适合。如果你想要一个空的切片,可以使用以下方式:

 slice := reflect.Zero(reflect.SliceOf(myType)).Interface()

但是我该如何在其上执行追加操作? - user732961
您可以使用 reflect.AppendAppendSlice 函数。 - Gustavo Niemeyer
1
@GustavoNiemeyer,我尝试了你的方法,看起来很不错,但是当我尝试将指向该切片的指针发送到一个库中时,它会破坏类型:http://play.golang.org/p/13nbz6z42b(请注意最后两个不匹配的事实)。 - Matthew Clark

5
注意:如果您想创建一个实际的数组(而不是切片),则在Go 1.5(2015年8月)中将有 reflect.ArrayOf。请参阅review 4111commit 918fdae,由Sebastien Binet (sbinet)修复2013年的问题5996

reflect:实现ArrayOf

此更改公开了reflect.ArrayOf,以在运行时创建新的reflect.Type数组类型,当给定reflect.Type元素时。

  • reflect:实现ArrayOf
  • reflect:用于ArrayOf的测试
  • runtime:文档化typeAlg被reflect使用并且必须保持同步
这允许进行类似于这样的测试
at1 := ArrayOf(5, TypeOf(string("")))
at := ArrayOf(6, at1)
v1 := New(at).Elem()
v2 := New(at).Elem()

v1.Index(0).Index(0).Set(ValueOf("abc"))
v2.Index(0).Index(0).Set(ValueOf("efg"))
if i1, i2 := v1.Interface(), v2.Interface(); i1 == i2 {
    t.Errorf("constructed arrays %v and %v should not be equal", i1, i2)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接