以下代碼嘗試為任何簡單結構實作通用 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 interface
CSVOutput(w, data, nil)
編譯失敗: cannot use data (type []Employee) as type CSVArray in argument to CSVOutput
據我所知,[] CSV不一樣的[]員工,如解釋在這里,和許多其他資源可在網上。
也就是說,是否可以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")
}
... ...
}
uj5u.com熱心網友回復:
是否可以使用反射重寫 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369738.html
上一篇:將二進制檔案轉換為位元組陣列
