dongzhuo2371 2017-06-12 19:27
浏览 38

如何使用反射制作多维数组或切片

I am currently working on a project to create a binding in Go for another language that utilizes multidimensional arrays. I'm trying to find a dynamic way to arbitarily create a slice of slices or array of arrays with potentially multiple dimensions. I am currently looking through the reflect documentation but nothing is jumping out at me that seems to be an intuitive method for doing what I need to do.

For context, I can get the type information and parse it into this struct:

const (
    IntTy byte = iota
    UintTy
    BoolTy
    StringTy
    AddressTy
    HashTy
    FixedPointTy
    FunctionTy
    FixedBytesTy
    StaticArrayTy
    DynamicArrayTy
    MultiDimensionalArrayTy
    StructTy
    BytesTy
)

// Type is the reflection of the supported argument type
type Type struct {
    // Slice descriptions
    IsStatic           bool // Determines if its a static array
    IsDynamic          bool // Determines if its a dynamic array
    IsMultiDimensional bool // Determine if there is more than dimension to the array
    SliceSize          int  // Size of the slice if it's static
    Dimensions         int  // Number of dimensions if type is a multidimensional array

    // If applicable (struct, slice), the underlying type
    Elem *Type

    Kind           reflect.Kind // corresponding go Kind.
    Type           reflect.Type // corresponding go Type.
    Size           int          // type size (denotes uint256, uint248, etc.)
    T              byte         // Our own type checking
    RequiresOffset bool         // denotes whether the type needs an offset

    stringKind string // holds the unparsed string for deriving signatures
}

Note that there are fields made to help describe the slice and the underlying type (we want to be as accurate as possible). I have a type byte as well as elements denoting the number of elements and dimensions for the slice. But what would be an intuitive way to create a golang multidimensional slice type from these description? One algorithm showcasing this for say a [][]uint or a [][][]uint would be greatly appreciated.

  • 写回答

1条回答 默认 最新

  • duan0818 2017-06-12 19:49
    关注

    Okay, I guess I didn't look at it hard enough the first time, but the answer is kind of obvious in retrospect. I made an example using this Go Playground right here: https://play.golang.org/p/J0pAGNIpDX

    ICYMI, the basic way is to take the type of the type you're working with (the base type) and then run the SliceOf/ArrayOf functions on the type in a loop for as many dimensions as you need.

    评论

报告相同问题?

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图