为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中实现 struct-to-csv 编写器

在 Go 中实现 struct-to-csv 编写器

Go
慕妹3146593 2022-10-17 15:37:23
以下代码尝试为任何简单结构实现通用 CSV 编写器。“简单”是指结构的字段值是标准的简单类型(int、string 等)。type (    CSV interface {        Header() []string        String([]string) (string, error)    }    CSVArray []CSV)func CSVOutput(w io.Writer, data CSVArray, cols []string) error {    if len(data) == 0 {        return nil    }    _, err := fmt.Fprintln(w, data[0].Header())    if err != nil {        return err    }    for _, d := range data {        str, err := d.String(cols)        if err != nil {            return err        }        _, err = fmt.Fprintln(w, str)        if err != nil {            return err        }    }    return nil}问题是CSVOutput()实际上不起作用。例如:var data []Employee //the Employee struct implements CSV interfaceCSVOutput(w, data, nil)编译失败:cannot use data (type []Employee) as type CSVArray in argument to CSVOutput我了解 []CSV 与 []Employee 不同,如此处所述,以及许多其他在线可用资源。也就是说,是否可以CSVOutput()使用反射重写函数:func CSVOutput(w io.Writer, data interfac{}, cols []string) error {    sliceOfIntf = castToSlice(data) //how to do this?    if !implementedCSV(sliceOfIntf[0]) { //and how to do this?        return errors.New("not csv")    }    ... ...}
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

是否可以使用反射重写 CSVOutput() 函数


是的


// if data is []Employee{...}, then you can do the following:


rv := reflect.ValueOf(data)

if rv.Kind() != reflect.Slice {

    return fmt.Errorf("data is not slice")

}

if !rv.Type().Elem().Implements(reflect.TypeOf((*CSV)(nil)).Elem()) {

    return fmt.Errorf("slice element does not implement CSV")

}


csvArr := make(CSVArray, rv.Len())

for i := 0; i < rv.Len(); i++ {

    csvArr[i] = rv.Index(i).Interface().(CSV)

}


// now csvArr is CSVArray containing all the elements of data

https://go.dev/play/p/gcSOid533gx


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号