如何为切片反射添加元素?

瓦尔达

嗨,我正在学习Go,我在做一些反思。我被困在这样的情况下:

  1. 我想创建一个slicestruct传递给功能interface{}
  2. 然后我想在此切片上添加新元素

这是一个带有代码示例游乐场

package main

import (
    "fmt"
    "reflect"
)

type A struct{ Name string }

func main() {
    bbb(A{})
}

func aaa(v interface{}) {
    sl := reflect.ValueOf(v).Elem()
    typeOfT := sl.Type()

    ptr := reflect.New(typeOfT).Interface()
    s := reflect.ValueOf(ptr).Elem()
    sl.Set(reflect.Append(sl, s))

    ptr = reflect.New(typeOfT).Interface()
    s = reflect.ValueOf(ptr).Elem()
    sl.Set(reflect.Append(sl, s))
}

func bbb(v interface{}) {
    myType := reflect.TypeOf(v)
    models := reflect.Zero(reflect.SliceOf(myType)).Interface()
    aaa(&models)

    fmt.Println(models)
}

错误: panic: reflect: call of reflect.Append on interface Value

有办法使它起作用吗?注意:我想参考。

解决方案:

这是我设法做的:运动场

瓦尔达

问题出reflect.Zero在我用reflect.New创造谎言的时候。在这里,您有完整的工作示例。

https://play.golang.org/p/3mIEFqMxk-

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type A struct {
    Name string `column:"email"`
}

func main() {
    bbb(&A{})
}

func aaa(v interface{}) {
    t := reflect.TypeOf(v)
    if t.Kind() == reflect.Ptr {
        t = t.Elem()
    }

    if t.Kind() == reflect.Slice {
        t = t.Elem()
    } else {
        panic("Input param is not a slice")
    }

    sl := reflect.ValueOf(v)

    if t.Kind() == reflect.Ptr {
        sl = sl.Elem()
    }

    st := sl.Type()
    fmt.Printf("Slice Type %s:\n", st)

    sliceType := st.Elem()
    if sliceType.Kind() == reflect.Ptr {
        sliceType = sliceType.Elem()
    }
    fmt.Printf("Slice Elem Type %v:\n", sliceType)

    for i := 0; i < 5; i++ {
        newitem := reflect.New(sliceType)
        newitem.Elem().FieldByName("Name").SetString(fmt.Sprintf("Grzes %d", i))

        s := newitem.Elem()
        for i := 0; i < s.NumField(); i++ {
            col := s.Type().Field(i).Tag.Get("column")
            fmt.Println(col, s.Field(i).Addr().Interface())
        }

        sl.Set(reflect.Append(sl, newitem))
    }
}

func bbb(v interface{}) {
    t := reflect.TypeOf(v)
    if t.Kind() == reflect.Ptr {
        t = t.Elem()
    }
    if t.Kind() != reflect.Struct {
        panic("Input param is not a struct")
    }

    models := reflect.New(reflect.SliceOf(reflect.TypeOf(v))).Interface()

    aaa(models)

    fmt.Println(models)

    b, err := json.Marshal(models)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(b))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为切片的3D numpy数组的所有元素添加值?

来自分类Dev

修复错误“切片”错误,以在单独的Excel单元格中添加元素列表

来自分类Dev

如何切片动态添加到元素的文本?

来自分类Dev

如何使用反射创建结构切片?

来自分类Dev

如何进行反射,新建切片并进行反射,将切片附加到源切片

来自分类Dev

如何为Numpy数组创建切片对象?

来自分类Dev

从反射类型创建切片

来自分类Dev

通过反射向List添加元素

来自分类Dev

如何添加元素?

来自分类Dev

如何交换数组,切片或Vec的元素?

来自分类Dev

如何在python的orderedDict中切片值元素?

来自分类Dev

如何使numpy数组切片元素与众不同?

来自分类Dev

如何在结构内部添加切片数组

来自分类Dev

如何反转切片?

来自分类Dev

在Go中使用反射设置切片索引

来自分类Dev

将json.RawMessage解组到反射切片

来自分类Dev

将切片复制到反射数组中

来自分类Dev

就地删除Golang切片元素

来自分类Dev

切片元素未更新

来自分类Dev

元素后的Laravel切片集合

来自分类Dev

如何计算添加元素?

来自分类Dev

如何为位向量实现自定义切片

来自分类Dev

如何为带有多索引的pandas DataFrame的切片分配新列?

来自分类Dev

如何为位向量实现自定义切片

来自分类Dev

如何为具有不同颜色的每一行绘制特定 DataFrame 的切片?

来自分类Dev

在Rails中,如何为所有记录的数组类型属性添加元素?

来自分类Dev

如何通过引用返回切片?

来自分类Dev

如何惯用地复制切片?

来自分类Dev

如何切片numpy数组的子集