golang reflect 问题请教

shaotteng · 2023-07-11 22:50:46 · 1398 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-07-11 22:50:46 的主题,其中的信息可能已经有所发展或是发生改变。

type T struct {
    Name string
    Age  int
}

func main() {
    var l []T
    a2s(&l)
    fmt.Printf("%#v", l)

}

func a2s(s any) error {
    sv := reflect.ValueOf(s).Elem()
    if sv.Kind() != reflect.Ptr && sv.Type().Kind() != reflect.Slice {
        return errors.New("必需是指针类型的切片")
    }
    svv := reflect.New(sv.Type().Elem())
    svv.Elem().FieldByName("Name").SetString("A")

    sv = reflect.Append(sv, svv.Elem())
    return nil
}

想通过反射为 l 赋值,但是并不成功,请问哪里需要修改?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1398 次点击  
加入收藏 微博
3 回复  |  直到 2023-07-12 11:07:48
jan-bar
jan-bar · #1 · 2年之前
package main

import (
    "errors"
    "fmt"
    "reflect"
)

type T struct {
    Name string
    Age  int
}

func main() {
    var l []T
    a2s(&l)
    fmt.Printf("%#v", l)

}

func a2s(s any) error {
    sv := reflect.ValueOf(s)
    if sv.Kind() != reflect.Ptr && sv.Type().Kind() != reflect.Slice {
        return errors.New("必需是指针类型的切片")
    }

    for _, v := range []string{"A", "B", "C"} {
        svv := reflect.New(sv.Elem().Type().Elem())
        svv.Elem().FieldByName("Name").SetString(v)

        sv.Elem().Set(reflect.Append(sv.Elem(), svv.Elem()))
    }
    return nil
}

反射就得用反射的方法,sv = reflect.Append(sv, svv.Elem())这种写法有问题,需要避免正常代码对你的影响。

shaotteng
shaotteng · #2 · 2年之前

谢谢

yanwenchuang
yanwenchuang · #3 · 2年之前
func main() {
    l := make([]T, 1)
    a2s(&l)
    fmt.Printf("%#v", l)
}

切片要初始化

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传